最近在糾結於大數據的checksum的計算,算法以下:算法
1 unsigned long cs_cal(const unsigned char *buff, unsigned long size) 2 { 3 unsigned long cs; 4 5 cs = 0; 6 while (size--) 7 cs += buff[size]; 8 9 return cs; 10 }
當文件大於4G後這種計算的龜速就很明顯了,在網上看到大牛說MMX指令對於數據計算至關不俗,因而改爲下面代碼(bug:不對齊部分沒有處理,這部分消耗很小,對於效率影響不大):測試
1 unsigned long cs_cal(const unsigned char *buff, unsigned long size) 2 { 3 unsigned long cs; 4 unsigned long cs_2[2]; 5 unsigned long cnt; 6 7 cnt = size / 2; 8 __asm { 9 mov eax, 0 10 movd mm2, eax 11 mov ecx, cnt 12 mov esi, buff 13 cnt_label: 14 mov al, byte ptr[esi] 15 movd mm0, eax 16 inc esi 17 18 mov al, byte ptr[esi] 19 movd mm1, eax 20 inc esi 21 22 punpckldq mm0, mm1 23 24 paddd mm2, mm0 25 26 dec ecx 27 jnz cnt_label 28 29 movq qword ptr [cs_2], mm2 30 31 32 emms 33 } 34 cs = cs_2[0] + cs_2[1]; 35 #endif 36 return cs; 37 }
測試1G的內存數據發現速度近快了2倍,MMX的威力果真不是吹的.大數據