- ベストアンサー
プログラムの高速化について質問です。
プログラムの高速化について質問です。 現在C言語でプログラムをかいているのですが、 1.プログラムの量を減らすため、*やforを使って繰り返し演算をする。 2.なるべく*やforを減らすため、長いプログラムにする この二つではどちらのほうがプログラムを高速化することが出来るのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
2、かと思います。 CPUがプリフェッチし易い環境をプログラムする(計算してからメモリ内容がわかるのではなく、CPUが先読みし易い実アドレスに近いプログラミング手法を採用する)。 http://www.sophia-it.com/content/%E3%83%97%E3%83%AA%E3%83%95%E3%82%A7%E3%83%83%E3%83%81 なお、せっかくCをやっておられるなら、データ並列/タスク並列による高速化にトライされてはいかがでしょうか。 http://japan.zdnet.com/video/intelpresents/story/0,3800083392,20356234,00.htm Cでそれができます(pdf ファイル:UNIX scalar plogramming 参照)。 http://www.google.co.jp/search?hl=ja&source=hp&biw=864&bih=572&q=scalar+programming&aq=f&aqi=&aql=&oq=&gs_rfai=
その他の回答 (5)
- tadys
- ベストアンサー率40% (856/2135)
現在のコンパイラは最適化の機能が優れているので下手に技巧をこらすよりは素直に分かりやすいコードを書くほうがいいでしょう。 わかりやすいコード=最適化しやすいプログラムです。
- kentarou2333
- ベストアンサー率42% (65/152)
みなさんおっしゃるように、ケースバイケースです。 ループの中身と、ループの処理自身のスピードを比較してみましょう。 ループの処理は、単純な足し算と比較です。 ループの中身の処理が、それと比較しても単純なものであれば、ループを 展開した方がいいでしょう。 例えば3乗するプログラムで、 for( i=0; i<3; i++ ) { y *= x; } みたいなのだったら、展開した方が速いでしょう。 ループの中身が、ループの処理よりも大きい場合は、 効果がほとんどなくなりますので、キャッシュを埋め尽くすデメリットが 大きいでしょう。 簡単にイメージしてみてください。 さっきの例だと、実際に実行するのは、 i=0 y *= x i++ i < 3 y *= x i++ i < 3 y *= x i++ i < 3 というようになります。(あまり真面目にチェックしてないのでイメージで ^_^ ) これだったら、 y*=x y*=x y*=x の方がいかにも速そうですよね。 正直、これぐらい明らかに速そうという場合以外は、 プログラムのメンテナンス性を高める キャッシュヒットすればその方が速そう キャッシュという限られた共有資産を使うのはほかのプログラムにも迷惑をかける といったあたりから、ループを展開するという技法は少なくなってきているようですね。
- kmee
- ベストアンサー率55% (1857/3366)
そういうのはケースバイケースです。 数回のループなら、forを処理する必要のない分、直接書いた方が速いかもしれません。 命令キャッシュに入る程度のものなら、だらだら長く書くよりループさせた方が速いかもしれません。 最近のコンパイラの最適化効率はよくなっているので、ヘタな考えでだらだら書くより、単純に書いてコンパイラにまかせた方が速いかもしれません。 あるCPU向けの高速化テクニックが、別のCPUで有効化どうかはわかりません。場合によっては、遅くなります。 *がかけ算だとすると(Cでは*はポインタの演算にも使われるので) 最近のCPUは浮動小数点演算回路が内蔵、または外部に提供されていることが多いので、下手に分割して計算するよりも、普通に書いて計算をまかせた方が速いです。 一つ言えることは。 高速化を気にして解読しにくいプログラムを書くと、デバッグに手間取り、完成が「遅く」なることがあります。 実行時間を1秒ケチって、完成が一ヶ月長くなった、というのでは(多くの場合)意味がないですから。
- php504
- ベストアンサー率42% (926/2160)
2だと思います プログラム高速化の手段としてループ展開というのがあります Cの速度最適化によっては自動でやってくれる場合もあるかもしれません
一概にどちらが、なんて答えは有りません。 中のコード次第です。