極悪です。
dune さんの [TSfree:753] プログラムを10倍速くする方法 から
>外側のループ:640 回 480 回
>内側のループ:640x480 回 480x640 回
>--------------------------------------
>合計 :1844800 回 1844352 回
>
>となるから、繰り返し回数の多いループを内側にもってきた後者のほうが、
>1844800 - 1844352 = 1198 回
・・・何を計算してんだか。
電卓を 16進入力,10進出力にしてました。
C:% perl -e "print hex(0x640*0x480+0x640)-hex(0x640*0x480+0x480)"
1198
C:%
正しくは 640 - 480 = 160 回です。しかし
#include <stdio.h>
#include <windows.h>
double bench(void f(void))
{
LARGE_INTEGER freq,start,now;
::QueryPerformanceFrequency(&freq);
::QueryPerformanceCounter(&start);
for(int i = 0; i < 1000; ++i){ f(); }
::QueryPerformanceCounter(&now);
return( (now.QuadPart - start.QuadPart) / double(freq.QuadPart) );
}
void slow_func(void)
{
for(int x = 0; x < 640; ++x){
for(int y = 0; y < 480; ++y){
;;;
}
}
}
void fast_func(void)
{
for(int y = 0; y < 480; ++y){
for(int x = 0; x < 640; ++x){
;;;
}
}
}
int main(void)
{
for(int i = 0; i < 10; ++i){
double fast = bench(fast_func);
double slow = bench(slow_func);
printf("diff :%lf[%%]\n",(slow-fast)/slow*100);
}
return 0;
}
D:% gcc inc2.cpp & a
diff :-1.130379[%]
diff :-0.066872[%]
diff :-1.644291[%]
diff :+2.497592[%]
diff :+1.414580[%]
diff :+2.282671[%]
diff :+1.904181[%]
diff :+0.490995[%]
diff :-7.056790[%]
diff :-0.370435[%]
D:%
こんな単純なコードでは差が出ません。Pure な MS-DOS なら
差が出そうですが。
--
極悪, FZH01112 at nifty.com
http://hpcgi1.nifty.com/dune/gwiki.pl?