運行壞境:虛擬機下ubuntu10.04, i3處理器
今天發現在pjsip開源代碼在實現哈希表值的時候竟然不是使用常見的“%”運算,而是“&”這讓我很好奇,猜想&運算比%運算要快,於是寫了下面代碼來驗證自己的猜想,事實確實是這樣的。
下面是比較運算符 (乘*、除/ 、求餘數%、與&、或| )的運算時間比較
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#define TOTAL_TIMES 1000000000
int main()
{
int i, res[5] = {12389};
struct timeval time[6];
unsigned long sub[5] = {0}, least;
//struct timeval tv1, tv2, tv3;
gettimeofday(&time[0], NULL);
for (i=0; i<TOTAL_TIMES; i++)
res[0] *= 64;
gettimeofday(&time[1], NULL);
for (i=0; i<TOTAL_TIMES; i++)
res[1] &= 64;
gettimeofday(&time[2], NULL);
for (i=0; i<TOTAL_TIMES; i++)
res[2] |= 64;
gettimeofday(&time[3], NULL);
for (i=0; i<TOTAL_TIMES; i++)
res[3] /= 64;
gettimeofday(&time[4], NULL);
for (i=0; i<TOTAL_TIMES; i++)
res[4] %= 64;
gettimeofday(&time[5], NULL);
//time(&t2);
for (i=0; i<6; i++)
{
printf("second:%d,micro:%d\n", time[i].tv_sec, time[i].tv_usec);
if (i > 0)
{
sub[i-1] = time[i].tv_sec*1000000-time[i-1].tv_sec*1000000 + time[i].tv_usec-time[i-1].tv_usec;
printf("sub[%d] = %ld\n", i-1, sub[i-1]);
if (i==1)
least = sub[i-1];
else
{
if (sub[i-1] < least)
least = sub[i-1];
}
}
}
printf("the least:%ld\n", least);
printf("ratio:(* & | / %)\n");
for (i=0; i<5; i++)
printf("%f\n", ((float)sub[i])/least);
return 0;
}
結果1:
second:1357635420,micro:84629
second:1357635422,micro:485139
sub[0] = 2400510
second:1357635424,micro:886265
sub[1] = 2401126
second:1357635427,micro:266230
sub[2] = 2379965
second:1357635430,micro:549131
sub[3] = 3282901
second:1357635434,micro:144127
sub[4] = 3594996
the least:2379965
ratio:(* & | / %)
1.008632
1.008891
1.000000
1.379390
1.510525
結果2:
second:1357635378,micro:207999
second:1357635380,micro:686956
sub[0] = 2478957
second:1357635383,micro:92050
sub[1] = 2405094
second:1357635385,micro:506162
sub[2] = 2414112
second:1357635388,micro:834081
sub[3] = 3327919
second:1357635392,micro:546280
sub[4] = 3712199
the least:2405094
ratio:(* & | / %)
1.030711
1.000000
1.003750
1.383696
1.543474
多次運行後發現,每次的結果並不完全相同,有時候“&=”計算最快,有時候“|=”計算最快,還有時候“*=”計算最快,所以總的說來可以確定的是:
1. &= 、|= 和*= 的計算時間大體相當,至於誰最快也不必過於計較了。
2. /=比%=運算更快些,但是都要比前面三個慢不少。