讀入時的速度cin我們可以用getchar()讀入整數
inline intread()
fread是直接對二進位制檔案進行讀入,速度更快
constint maxbuf = 100000
;char buf[maxbuf], *ps = buf, *pe = buf+1
;inline
void
rnext()
template
inline
bool
in(t &ans)
while(!isdigit(*ps) && ps !=pe);
if(ps == pe) return
false;//
eofdo
while(isdigit(*ps) && ps !=pe);
ans *=f;
return
true
;}
1、位運算優化:乘上2的冪或除以2的冪時可以直接用位運算進行優化
2、除法、取模優化:除法運算的耗時是乘法運算的幾倍,能不用盡量不用,比如i/a>b可以以換成i>a*b
3、浮點數除法優化:
floata,b,c;
init(a,b,c);
a/=c;
b/=c;
可以換成
floata,b,c;
init(a,b,c);
float d=1/c;
a*=d;
c*=d;
1、一維陣列的陣列大小盡量開成2的冪,高維陣列每一維的陣列大小最好都不要開成2的冪!(狀壓dp時要尤其注意)
2、遍歷陣列時最好按陣列存放順序遍歷
for example
//first
for(int i=0;i)
for(int j=0;j)
a[i][j]*=2;
//second
for(int i=0;i)
for(int j=0;j)
a[j][i]*=2;
第一種比第二種效率快得多
3、陣列的索引也是需要時間的,特別是高位陣列的索引尋位址效率很低,因此我們可以用指標來代替陣列定址
//first
int a[55][65][75][85
];int
main()
//second
int a[55][65][75][85
];int
main()
} //
third
int a[55][65][75][85
];int
main()
很明顯,效率上第一種》第二種》第三種,但很多時候並不是單純的按順序訪問陣列,這種時候第二種寫法(只需要對3維陣列定址)就派上用場了
3、迴圈展開
舉乙個很蠢的例子
int cnt=0;for(int i=0;i)
cnt++;
int cnt1=0,cnt2=0,cnt3=0,cnt4=0;for(int i=0;i4
) cnt1++,cnt2++,cnt3++,cnt4++;
int cnt=cnt1+cnt2+cnt3+cnt4;
第二種的效率是是一種的4倍
這裡有兩點需要注意的
(1)迴圈展開一般最多展開8重,再多的話反而會使效率降低
(2)迴圈展開的各條語句一定要是無關的,比如
int cnt=0;for(int i=0;i4
) cnt++,cnt++,cnt++,cnt++;
這樣寫效率沒有顯著提公升(因為4條語句都要用到cnt,4條語句相關)
黑科技
//只適用於本地除錯or打表struct
hugeint
void write() const
hugeint
operator + (hugeint b) const
};
一些黑科技
寫出來很炫酷,但原理很簡單,就是通過轉換整形到字元進行處理。inline int in while isdigit ch x x 3 x 1 ch 0 ch getchar return x w inline void out int x,char s 值得注意的是,這兩個函式需要include 當...
優化shader程式的一些tips
在寫shader的時候,其實一些寫法對於其執行影響非常大,而且由於gpu和cpu在架構上的不同,的優化思想也不一樣,最近一直在寫幾個shader,為了效能問題,查閱了很多資料,把一些tips總結下來。首先要樹立幾個思想 1.gpu是simd的架構,即單指令多資料流架構,即在gpu上同時執行n個資料和...
kylin總結(一些重要概念以及基礎優化)
apache kylin 是hadoop大資料平台的乙個開源olap引擎。採用多位立方體預計算技術,可以將大資料sql查詢速度達到亞秒級別。其實就是資料立方的一種實現,可以參考韓家偉的 資料探勘 概念與技術 裡面對資料立方有詳細介紹。簡單來說資料立方就是以空間換時間,通過定義一系列的緯度,對每個緯度...