本文章主要研究各種變量類型加減乘除以及取模所耗費時間的差異
以下不作特殊說明均爲1e9次操作,時間均以毫秒記,測量多次取平均數
由於機子問題,測得時間可能不同,但其快慢比較相對可信(32位XP系統 版本2002 )
for循環
for(int i=1;i<=1000000000;++i);
++i : 2145ms
i++ : 2153ms
i+=1 : 2130ms
1−2e9, i+=2 : 2132ms
可以看到這些幾乎沒有影響,i+=1也並沒有單獨的優化,與i+=2時間並無明顯變化相同
- -i : 2158ms
i- - : 2167ms
i-=1 : 2153ms
讓我有點喫驚的是,減法幾乎並不慢
還有,+=和-=運算符竟然也不慢,從時間來看甚至還稍微快些,雖然可能是機子誤差,但至少並不比++和- -慢
for(int i=1;i<=1000000000;++i)++k;
2590ms
for(int i=1;i<=1000000000;++i)++k,++k;
4379ms
所以執行1e9遍加法的速度接近1800ms
減法速度相近
for(int i=1000000000;i>=1;--i)k=i;
3045ms
賦值竟然這麼慢
但如果
for(int i=1000000000;i>=1;--i)k=10;
或者
for(int i=1000000000;i>=1;--i)k=k;
2218ms
優化起了作用
又:i改成longlong後空循環幾乎多了一倍時間
再看while
++i : 2355ms
i++ : 2378ms
i+=1 : 2350ms
- -i : 2365ms
i- - : 2368ms
i-=1 : 2343ms
比for循環總體要慢,大概是while和for判斷條件的機制不同吧
乘法
for(int i=1000000000;i>=1;--i)k*=1;
2181ms
for(int i=1000000000;i>=1;--i)k*=1,k*=1;
2218ms
出人意料的快,是不是?
但是如果乘的不是1,就會大大降低效率
看起來並沒有做真正的乘法
for(int i=1000000000;i>=1;--i)k*=10;
2605ms
for(int i=1000000000;i>=1;--i)k*=10,k*=10;
5437ms
1e9遍乘法大概2800ms,是加法的一倍半
還有一個奇怪的問題,在乘11的時候,速度慢的有點奇怪,到了3125ms和6265ms
而乘其他的數,速度會快許多,平均在2500ms和4900ms左右。
while測試結果幾乎相同,此處不再放上
除法
for(int i=1000000000;i>=1;--i)k/=1;
2234ms
for(int i=1000000000;i>=1;--i)k/=1,k/=1;
2312ms
有了乘法的先例,這個結果不讓人那麼喫驚,優化確實能起作用
for(int i=1000000000;i>=1;--i)k/=10;
4078ms
for(int i=1000000000;i>=1;--i)k/=10,k/=10;
7746ms
1e9遍除法大概3700ms,是加法的兩倍還要多
取模
for(int i=1000000000;i>=1;--i)k%=1;
2151ms
for(int i=1000000000;i>=1;--i)k%=1,k%=1;
2859ms
優化還是有的
for(int i=1000000000;i>=1;--i)k%=10;
5437ms
for(int i=1000000000;i>=1;--i)k%=10,k%=10;
11453ms
1e9遍取模大概6100ms,接近加法的三倍半
取模的慢果然名不虛傳
因爲整理數據的過程實在太過繁瑣,下面只給出結論
以下提到的倍數皆以int加法比較(1e9遍int加法接近1800ms)
long long
1e9遍longlong加法大概2700ms,是int加法的一倍半,與int乘法相當
減法幾乎與此相同
1e9遍longlong乘法大概3600ms,是int加法的兩倍
1e9遍longlong除法大概13700ms,是int加法的七倍半還要多!
1e9遍longlong取模大概11800ms,是int加法的六倍半多!
short
1e9遍short加法大概1700ms,比int加法稍快
減法幾乎與此相同
1e9遍short乘法大概3600ms,是int加法的兩倍,與longlong幾乎相同,比int乘法還要慢?
1e9遍short除法大概4000ms,比int除法也要慢?
1e9遍short取模大概7000ms,比int取模慢1000ms左右?
(可能因爲我的機子是32位?)
還是不要亂用short爲妙
double
1e9遍double加法大概4000ms,是int加法的兩倍多
減法幾乎與此相同
1e9遍double乘法大概10500ms,是int加法的兩倍多,幾乎與double加法相同
1e9遍double除法大概2700ms,接近int加法的六倍
long double
1e9遍longdouble加法大概9200ms,是int加法的五倍多
減法幾乎與此相同
1e9遍longdouble乘法大概9200ms,是int加法的五倍多,幾乎與longdouble加法相同
1e9遍longdouble除法大概16100ms,是int加法的九倍
後記:可能由於這臺機子是32位系統,long long 和long dopuble都慢的嚇人,等有空再拿64位測試