最適化って何なん?

アバター
sizuma
記事: 8
登録日時: 15年前
住所: 鹿児島

最適化って何なん?

投稿記事 by sizuma » 14年前

他の方の日記であったんですが、ポインタを使った高速化についてです。
http://dixq.net/forum/blog.php?u=493&b=1021


特に処理をしていないんで、ぶっちゃけ参考にならないけどね。
Debugで実行すると後から実行するほうが5%ぐらい早いかな。
正直誤差だと思う。
Releaseでするとポインタ使わないほうが比較にならないほど早いです。
ていうかこのコードだと0.00までしか計れないので。

この速度差は、ポインタを弄らない場合はすっごく最適化されてるってことだと思います。
僕ぐらいの腕だと、高速化のためのポインタを下手に弄らないほうがいいわけですね。

どんなアセンブリが出力されているのかまで見る元気はないぜ。
もう3時だし(^^;)

CODE:

#include 
#include 

void goukei(int*, int*);
void goukei_pointer(int*, int*);


int main(void){
	clock_t start,end;
	int i,j;
	int tensu[5]={1,2,3,4,5};
	int sum;
	start = clock();
	for(j = 0;j<10000000;j++){
		goukei(&sum,tensu);
	}
	end = clock();
	printf("合計%d\n",sum);
	printf("[]アクセス %.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);

	
	start = clock();
	for(j = 0;j<10000000;j++){
		goukei_pointer(&sum,tensu);
	}
	end = clock();
	printf("合計%d\n",sum);
	printf("*アクセス %.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
}

//ポインタなし
void goukei(int *x, int* tensu){
	int sum=0;
	int length = 5;
	int i;
	for(i=0;i<length;i++){
		sum += tensu[i];
	}
	*x = sum;
}


//ポインタ
void goukei_pointer(int *x,int* tensu) 
{
    int sum=0;
    int *endp = &tensu[5];
    int *p = &tensu[0];
    while (p < endp) {
        sum += *(p++);
    }
    *x=sum;
}


ISLe
記事: 2650
登録日時: 15年前

Re: 最適化って何なん?

投稿記事 by ISLe » 14年前

引数で渡すなら有効利用しないとダメです。
中途半端は逆効果なのです。

CODE:

//ポインタ
void goukei_pointer(int *x,int* tensu) 
{
    int sum=0;
    int *endp = &tensu[5];
    while (tensu     for(j = 0;j        goukei(&sum,tensu);
>    }
が
sum = 15;
と最適化されてます。
(追記)printfの引数に直接積まれてました。実行時間ゼロです。
最後に編集したユーザー ISLe on 2010年12月26日(日) 03:32 [ 編集 2 回目 ]

アバター
sizuma
記事: 8
登録日時: 15年前
住所: 鹿児島

Re: 最適化って何なん?

投稿記事 by sizuma » 14年前

>ISLeさん
>tensu
ほんとですね、わざわざ無意味にコピってました。

結構大胆に最適化されちゃうんですね。
コンパイラの勉強したかったんで、最適化もちょっと興味はあるんですが、難しそうだ。

コメントありがとうございました