C++を利用している方に質問です.

組んだprogramを高速化するというのは, 非常に重要なテーマだと思うのですが, みなさんはどういうノウハウをお持ちですが?

特に, 数値計算に関するprogramの高速化についての情報をいただけるとありがたいです. (性能のよい計算機にするとかではなく, あくまでprogramをどう書くかを教えてください)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/10/27 01:17:30
  • 終了:2007/11/03 01:20:03

回答(4件)

id:paraizo No.1

paraizo回答回数139ベストアンサー獲得回数102007/10/27 01:32:17

ポイント23pt

templateを使う。

結果をキャッシュ、ハッシュテーブルとか。

http://q.hatena.ne.jp/answer

id:Q-tarou

ありがとうございます. ただ, 使い方がわからないので, 簡単な説明か参考になるurlをおしえていただけるでしょうか?

2007/10/27 01:47:49
id:ttamo No.2

たも回答回数175ベストアンサー獲得回数292007/10/27 09:27:21

ポイント23pt

「C++ プロファイラ ボトルネック」で検索してみるとヒントが出てくるはず。

http://www.ibm.com/developerworks/jp/linux/library/l-gnuprof/ind...

とか。

id:Q-tarou

ありがとうございます. 調べてみます

2007/10/27 17:00:55
id:Bookmarker No.3

しおり回答回数191ベストアンサー獲得回数342007/10/27 12:33:31

ポイント22pt

基本的には、狭い範囲ではなく広い範囲でアルゴリズムを最適化します。

C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series)

8. 時期尚早な最適化を行わない

◇要約

(前略)

時期尚早な最適化は、非生産的でありながら癖になり易い。最適化に関する最初のルールは、「するな」。第二のルール(上級者編)は、「まだするな」。測定は2回、最適化は1回。

ただし、以下のような細かいところにも気をつけます。

9. 時期尚早に最不適化してしまわない

◇要約

(前略)

他の条件がすべて等しい場合、とりわけ、コードの複雑さと読み易さが等しい場合、効率的なデザインパターンとコーディングイディオムを選んでさえいれば、無理なく作業が進み、非効率的なコードを生み出すこともない。これは、時期尚早な最適化ではなく、余計な最不適化を避けるものだ。

◇解説

(前略)

  • リファレンス渡しが適当な状況で、値渡しのパラメータを定義する(項目 25 参照)。
  • 前置形式で十分な箇所で後置形式の ++ を使う(項目 28 参照)。
  • メンバーの初期化を、初期化リストではなく、コンストラクタ内部の代入で行う(項目 48 参照)。

(後略)

14. 実行時エラーよりも、コンパイル時エラーとリンク時エラーを歓迎しよう

◇要約

ビルド時にできることを、実行時まで延ばすな: コードを書くときは、実行時チェックに頼るのでなく、コンパイラがコンパイル時にチェックしてくれるコードを書こう。

(後略)

◇解説

(前略)

  • 静的チェックは実行時のオーバーヘッドを生じない: 静的チェックを行った場合、ビルド結果の実行イメージは、正確さを犠牲にすることなく、動的チェックを行った場合よりも速い。

(後略)

◇例

(前略)

・例1: コンパイル時ポリモルフィズム。汎用の関数や型を定義するときは、実行時のポリモルフィズム(仮想関数)をコンパイル時ポリモルフィズム(テンプレート)に置き換えることを検討してみよう。後者の方が静的チェックに適したコードとなる。

(中略)

・例4: ダウンキャスト。ダウンキャストするために、dynamic_cast(さらに、キャスト結果をチェックしない static_cast)を頻繁に使うのは、使用する基本クラスの提供する機能が少なすぎる徴候かもしれない。プログラムが基本クラスに基づいて処理を表現できるように、インターフェースの設計を見直そう。

28. インクリメント演算子(++)どデクリメント演算子(--)の標準形式を使おう

前置形式を使おう

◇要約

(前略)

元の値を必要としないときは前置形式の演算子を呼び出そう。

◇解説

(前略)

後置形式の ++ と -- は元の値を返すが、前置形式は新しい値を返す。後置形式は前置形式を使って実装しよう。

(中略)

後置形式の返す元の値が呼び出し側コードで必要なければ、前置形式を使うようにしよう。前置形式は意味的に同等で、入力の手間も変わらず、生成するオブジェクトが1個少ない分わずかに効率的だ。

(後略)

48. コンストラクタでは、代入よりも初期化を使おう

◇要約

(前略)

コンストラクタで行うメンバー変数の設定には、代入よりも初期化を使おう。タイプ量は変わらず、実行時の不要な処理を回避できる。

id:Q-tarou

ありがとうございます. 現在はこの書籍を持っていませんので, 購入してみようと思います

2007/10/27 17:01:30
id:paraizo No.4

paraizo回答回数139ベストアンサー獲得回数102007/10/29 18:51:54

ポイント22pt

templateはポリモーフィズムや各種数値計算を実行時ではなくコンパイル時に行う機能です。

http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/node...

これを使うとvirtualなどによるオーバーヘッドの高いポリモーフィズムを静的にリンクしたり、イニシャル時に計算によって求めるような定数をわかりやすい形で書いたりすることができます

この本に詳しく載ってますがかなり読み応え(難解)があるので注意してください

http://www.amazon.co.jp/dp/4894714353

キャッシュ、ハッシュテーブルは結果をキャッシュするテーブルを作り具体的な計算をしないで実行結果を取り出すやり方です。

例えば三角関数のテーブルの場合

for(i=0;i<360;i++) sin_table[i] = sin(i*M_PI/180); // キャッシュメモリの容量が少なく条件分岐のコストが低い場合は90度のテーブルの方が速い

のようなテーブルを作っておいてsinの値が必要なときはこれを引きます

http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/misc/SinCos_Table.ht...

ハッシュテーブルはインデックスに工夫を加えて疎らなテーブルでもメモリの中に収まるように改良を加えたものです

id:Q-tarou

丁寧な回答ありがとうございます. 参考になりました.

2007/10/29 18:56:11

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • 高速なコードを書く方法 >templateはポリモーフィズムや各種数値計算を実行時ではなくコンパイル時に行う機能です。 from http://q.hatena.ne.jp/1193415446 ということは仮想関数によるポリモーフ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません