ページ 11

for文で、複数の処理を纏めて書くと処理が重くなってしまいます

Posted: 2010年5月03日(月) 01:35
by アトラス
メッセージウィンドウを作る自作関数でちょっと悩んでいます。

x1,y1→ウィンドウの左上の座標
x2,y2→ウィンドウの右下の座標

void window(int x1,int y1,int x2,int y2){
    int i,t1,t2;



    DrawGraph(x1,y1,win.hidariue,true);//左上
    DrawGraph(x2-5,y1,win.migiue,true);//右上
    DrawGraph(x1,y2-5,win.hidarishita,true);//左下
    DrawGraph(x2-5,y2-5,win.migishita,true);//右下
    DrawExtendGraph(x1+5,y1+5,x2-5,y2-5,win.dot,true);//中心部分

    t1=GetNowCount();

    for(i=x1+5;i<x2-5;i++)
        DrawGraph(i,y2-5,win.shita,true);//下部分


    for(i=x1+5;i<x2-5;i++)
        DrawGraph(i,y1,win.ue,true);//上部分


    t1 = GetNowCount()-t1;

    t2=GetNowCount();

    for(i=y1+5;i<y2-5;i++)
        DrawGraph(x2-5,i,win.migi,true);//右部分


    for(i=y1+5;i<y2-5;i++)
        DrawGraph(x1,i,win.hidari,true);//左部分


    t2=GetNowCount()-t2;
    DrawFormatString(10,10,black,"%d %d",t1,t2);


}
と書いた場合と
void window(int x1,int y1,int x2,int y2){
    int i,t1,t2;



    DrawGraph(x1,y1,win.hidariue,true);//左上
    DrawGraph(x2-5,y1,win.migiue,true);//右上
    DrawGraph(x1,y2-5,win.hidarishita,true);//左下
    DrawGraph(x2-5,y2-5,win.migishita,true);//右下
    DrawExtendGraph(x1+5,y1+5,x2-5,y2-5,win.dot,true);//中心部分

    t1=GetNowCount();

    for(i=x1+5;i<x2-5;i++){
        DrawGraph(i,y1,win.ue,true);//上部分
        DrawGraph(i,y2-5,win.shita,true);//下部分
    }



    t1 = GetNowCount()-t1;

    t2=GetNowCount();

    for(i=y1+5;i<y2-5;i++){
        DrawGraph(x1,i,win.hidari,true);//左部分
        DrawGraph(x2-5,i,win.migi,true);//右部分
    }


    t2=GetNowCount()-t2;
    DrawFormatString(10,10,black,"%d %d",t1,t2);


}
と書いた場合で、処理速度がかなり違います

前者はt1,t2ともに1ミリ秒以下なのに対し、後者はt1,t2ともに16ミリ秒を超えています・・・。

一つのfor文の中身はなるべく少なくなるようにした方がいいのでしょうか?

Re:for文で、複数の処理を纏めて書くと処理が重くなってしまいます

Posted: 2010年5月03日(月) 06:00
by ookami
おはようございます。

上記の2つの例なら、違いはないです(強いて言えば前者の方が重いはずですが、微々たる物です)。おそらく時間計測の精度の問題ですね。

GetNowCountは「ミリ秒単位で返す」とヘルプにもありますが、環境によって(だったかな?)精度が違います。こちらの環境では「約16ミリ秒」単位になります。例えば以下のプログラムを走らせると、よく分かると思います。

for(i=0;i<1000;i++) {
printf("%d\n",GetNowCount());
}

出力結果は「滑らかな上昇」ではなく、「約16msごとに階段状に上昇」になるはずです。

Re:for文で、複数の処理を纏めて書くと処理が重くなってしまいます

Posted: 2010年5月03日(月) 20:19
by ru-pu
DXライブラリの高速描画手法の一つとして同じ画像をなるべく連続して描画するというのがあったはずです。
前者の方は同じ画像を連続して描画しているのに対して後者は1ループ中に違う画像を描画しているから
前者の方が高速に動作しているのではないでしょうか?
一見後者の方がfor文の数が少なくて高速に動作するように見えまずが、何回計測しても同じ結果が
出るのでしたら多分画像の連続描画による高速化の方がfor文の数を減らすよりも処理負荷軽減効果が
大きいということだと思います。 画像

Re:

Posted: 2010年5月04日(火) 00:53
by アトラス
>DXライブラリの高速描画手法の一つとして同じ画像をなるべく連続して描画するというのがあったはずです。

なるほど、そういうことだったんですね、納得行きました。

お二人とも回答ありがとうございました。