作者: dune
日時: 2004/8/29(22:52)
極悪です。

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?