人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C++を利用している方に質問です.
組んだprogramを高速化するというのは, 非常に重要なテーマだと思うのですが, みなさんはどういうノウハウをお持ちですが?

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

●質問者: Q-tarou
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:C++ テーマ ノウハウ 数値計算 計算機
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● paraizo
●23ポイント

templateを使う。

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

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

◎質問者からの返答

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


2 ● たも
●23ポイント

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

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

とか。

◎質問者からの返答

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


3 ● しおり
●22ポイント

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

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

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

◇要約

(前略)

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

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

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

◇要約

(前略)

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

◇解説

(前略)

(後略)

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

◇要約

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

(後略)

◇解説

(前略)

(後略)

◇例

(前略)

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

(中略)

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

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

前置形式を使おう

◇要約

(前略)

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

◇解説

(前略)

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

(中略)

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

(後略)

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

◇要約

(前略)

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

◎質問者からの返答

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


4 ● paraizo
●22ポイント

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...

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ