程式玄學常數優化以及一些黑科技(持續更新)

2022-05-23 21:36:10 字數 2151 閱讀 4443

讀入時的速度cin我們可以用getchar()讀入整數

inline int

read()

fread是直接對二進位制檔案進行讀入,速度更快

const

int 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、浮點數除法優化:

float

a,b,c;

init(a,b,c);

a/=c;

b/=c;

可以換成

float

a,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查詢速度達到亞秒級別。其實就是資料立方的一種實現,可以參考韓家偉的 資料探勘 概念與技術 裡面對資料立方有詳細介紹。簡單來說資料立方就是以空間換時間,通過定義一系列的緯度,對每個緯度...