
No.6ベストアンサー
- 回答日時:
2、かと思います。
CPUがプリフェッチし易い環境をプログラムする(計算してからメモリ内容がわかるのではなく、CPUが先読みし易い実アドレスに近いプログラミング手法を採用する)。
http://www.sophia-it.com/content/%E3%83%97%E3%83 …
なお、せっかくCをやっておられるなら、データ並列/タスク並列による高速化にトライされてはいかがでしょうか。
http://japan.zdnet.com/video/intelpresents/story …
Cでそれができます(pdf ファイル:UNIX scalar plogramming 参照)。
http://www.google.co.jp/search?hl=ja&source=hp&b …
No.5
- 回答日時:
現在のコンパイラは最適化の機能が優れているので下手に技巧をこらすよりは素直に分かりやすいコードを書くほうがいいでしょう。
わかりやすいコード=最適化しやすいプログラムです。
No.4
- 回答日時:
みなさんおっしゃるように、ケースバイケースです。
ループの中身と、ループの処理自身のスピードを比較してみましょう。
ループの処理は、単純な足し算と比較です。
ループの中身の処理が、それと比較しても単純なものであれば、ループを
展開した方がいいでしょう。
例えば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
の方がいかにも速そうですよね。
正直、これぐらい明らかに速そうという場合以外は、
プログラムのメンテナンス性を高める
キャッシュヒットすればその方が速そう
キャッシュという限られた共有資産を使うのはほかのプログラムにも迷惑をかける
といったあたりから、ループを展開するという技法は少なくなってきているようですね。
No.3
- 回答日時:
そういうのはケースバイケースです。
数回のループなら、forを処理する必要のない分、直接書いた方が速いかもしれません。
命令キャッシュに入る程度のものなら、だらだら長く書くよりループさせた方が速いかもしれません。
最近のコンパイラの最適化効率はよくなっているので、ヘタな考えでだらだら書くより、単純に書いてコンパイラにまかせた方が速いかもしれません。
あるCPU向けの高速化テクニックが、別のCPUで有効化どうかはわかりません。場合によっては、遅くなります。
*がかけ算だとすると(Cでは*はポインタの演算にも使われるので)
最近のCPUは浮動小数点演算回路が内蔵、または外部に提供されていることが多いので、下手に分割して計算するよりも、普通に書いて計算をまかせた方が速いです。
一つ言えることは。
高速化を気にして解読しにくいプログラムを書くと、デバッグに手間取り、完成が「遅く」なることがあります。
実行時間を1秒ケチって、完成が一ヶ月長くなった、というのでは(多くの場合)意味がないですから。
No.2
- 回答日時:
2だと思います
プログラム高速化の手段としてループ展開というのがあります
Cの速度最適化によっては自動でやってくれる場合もあるかもしれません
参考URL:http://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC% …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 1. 仮想CPU「exmini」を使用して,「$dataからn減算する」プログラムを作成してください 2 2022/07/04 17:49
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- C言語・C++・C# c言語で自然数nを入力、2以上n以下の偶数の累積sumを求めるプログラムをfor文を使って作りたいで 4 2022/11/09 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
流れ図(フローチャート)が分か...
-
素数表について。
-
画面を強制的に再描画させる方法
-
乱数の桁数指定、または範囲指定。
-
VB2010でCSVファイルの読み込み
-
CSVファイルの特定の行だけを読...
-
プログラムの高速化について質...
-
「偶数・奇数の和」のフローチ...
-
<select size='7' multiple>...
-
【FORTRAN77】DO WHILE文 これ...
-
EXCEL VBA ユーザーフォームの...
-
VBAでの一時停止と再開の方法
-
ループ内での条件処理
-
多重ループの抜けだし方
-
vb.netです。2次元配列の要素を...
-
テキストボックスの名前に変数...
-
CSVからACCESSのフールドに取り...
-
動く文字<MARQUEE>
-
エクセル関数で1〜12の数字がル...
-
emacsについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
流れ図(フローチャート)が分か...
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
VBAで3秒だけ時間を止めたい
-
vb.netです。2次元配列の要素を...
-
エクセルの当番表を作っていま...
-
vb.netからエクセル関数書き込み
-
DOSコマンドのループ内のTIMEコ...
-
「偶数・奇数の和」のフローチ...
-
GIFアニメをループさせたくない
-
Do whileでExitせず、ループの...
-
VB2010でCSVファイルの読み込み
-
【VBA】全て空白のセルの列の非...
-
アクティブセルから、A列最終行...
おすすめ情報