• ベストアンサー

一時的なポインタを作る場合との速度比較についてです

以下のものを用意します。 int i=10; int a[i], b[i]; この時、配列aに中身を全部入れ終わった後、全てをbに移し替えたいとします。 その場合 while (i) { --i; b[i] =a[i]; } とするか int *c =a+10, *d =b+10; を用意して while (i) { --i; *--d =*--c; } とするかでは、十分に要素数が多ければ、常に後者の方が間違いなく高速でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

コンパイラが十分に賢ければ、どちらも同じです。 それ以上の最適化を求めるなら、アセンブリ出力を見ながら最適化するほうが確実ですね。 CPUによっては、 for(~){ d[0]=s[0];d[1]=s[1];d[2]=s[2];d[3]=s[3]; d[4]=s[4];d[5]=s[5];d[6]=s[6];d[7]=s[7]; d[8]=s[8];d[9]=s[9];d[10]=s[10];d[11]=s[11]; d[12]=s[12];d[13]=s[13];d[14]=s[14];d[15]=s[15]; s+=16; d+=16; } なんてコードが早かったCPUもありました。 さらにパイプラインとか考慮しはじめるともっと複雑です。

FBL
質問者

お礼

なるほど、確かにアセンブリ出力を見て最適化すれば思いどおりですよね! そのうち余裕が出来たら勉強してみます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

常にとは言えない気がします コンパイラやCPUで変わる可能性があります ns ps はナノ秒とピコ秒ではないでしょうか

FBL
質問者

お礼

なるほど、それで意味は通りますね! 理解しました。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

>十分に要素数が多ければ、 って、どれだけを想定してますか? whileの処理だけで言えばアセンブラレベルなら「おそらく」後者。 「おそらく」って言ってるのは、コンパイラやCPU系に依存する部分が多いから。 それだってns/psレベルの差が問題となるような場合でもなければ意味はありませんが。

FBL
質問者

お礼

ありがとうございます。 アルゴリズムを工夫して頑張って抑えても 場合によっては数千万とか数億とかそれ以上になる可能性があります。 for文の場合でもそれは同様でしょうか? ググっても分からなかったのですが、ns/psとは何者でしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A