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

プログラムを高速化させるテクニックを、できるだけわかりやすく説明してください。
私が関心が強いのは将棋ソフトですが、それ意外のことでも構いません。
急ぎませんので慌てず回答をお願いします。

●質問者: jyouseki
●カテゴリ:コンピュータ
✍キーワード:ソフト プログラム 将棋 高速化
○ 状態 :終了
└ 回答数 : 9/9件

▽最新の回答へ

1 ● ratbeta
●30ポイント

とりあえず基本方針としては、「コードのサイズを小さくする」でしょうか。

それを達成するには効率的なコードが必要とされるため、自然と不要なコードが減って高速化されます。

一箇所や二箇所では大した効果は望めませんが、ループの中の処理について効率化したり、多くの箇所で同様の効率化を行うことで、

場合によってはかなりの高速化が行われる場合も有ります。

また、最近のコンパイラは最適化によっても高速化を行うことができます。

特にC(++)で開発する場合にVCやICCなどのコンパイラを用いることで高速化が期待できます。

…と、特に開発言語も記述されていないので概念のみを書いてみました。

◎質問者からの返答

回答ありがとうございます。

言語は将棋ソフトの場合、ほとんどCかC++です。


2 ● m-nisi
●0ポイント

アルゴリズム的な事は誰かが書くと思うので、別のアプローチを。

forよりもwhileが早いです。

i=i+1,i+=1よりもi++の方が早いです。

あんまり細かすぎて役に立たないかもしれませんが、

頭の片隅に。

あ、ポイントは要らないです。

◎質問者からの返答

回答ありがとうございます。


3 ● katsube
●30ポイント

あまりオススメできない方法から。

C/C++をお使いということであればインラインアセンブラを

利用するという手があります。速くなりますがコードの保守性は

下がります。

http://e-words.jp/w/E382A4E383B3E383A9E382A4E383B3E382A2E382BBE3...

また、演算は極力ビットレベルの計算を行うなどもあります。

例えばビットシフトなど。

http://proger.blog10.fc2.com/blog-entry-62.html

ほかには関数ではなく、defineを使いまくるなどの方法。

ファイルに記録するのではなく、情報はすべてmallocなどでメモリがガツッと確保してそこで行うなどなど。

※終了する際に保存してやる。

よく言われているこですからあまり参考にならないですかね(^^;

◎質問者からの返答

回答ありがとうございます


4 ● nandedarou
●20ポイント

時間が掛かる計算は予め計算して、パラメータと結果の組合せをデータとして保存して置き、プログラム実行時にそれを参照する。

データ部も含めたコードの長さは、実行時に計算する場合に比べ、長くなると思われますが、スピードは上がると思います。

将棋の定石などはこれに当たるかも知れませんね。

◎質問者からの返答

回答ありがとうございます。

「定石」は囲碁用語で、将棋では「定跡」と書きます。


5 ● takagidotin
●30ポイント

当然のことですが、まずはアルゴリズムを徹底的にチューニングしましょう。

次に、C++の場合ですが、仮想関数のような動的な処理は最小限に抑えて、テンプレートを使うなどの方法で、可能なものは静的に解決しましょう。静的に解決できれば、実行時のコストは0になります。

三番目に、例外処理の振る舞いを(内部的な実現方法まで含めて)正しく把握しましょう。自分では例外処理を使っていないつもりでも、コンパイラは例外処理のためのコードを勝手に埋め込みます。例外を送出しない関数には例外指定 throw() を付け、例外処理を行うべき場所で適切に扱うようにしましょう。

四番目に、標準ライブラリを有効活用しましょう。十分にチューニングされた仕様と実装を持つ標準ライブラリは、通常自作の関数より高速です。

最後に、コンパイル結果を可能な限り確認する習慣を付けましょう。これによって、処理系の癖が把握でき、どうすれば効率のよいコードが書けるかが見えてくるはずです。

◎質問者からの返答

回答ありがとうございます。


1-5件表示/9件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



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