高速化のポイントを記載しておこうと思う。
余計な処理(コスト)を関係の無い場所に作らないことによる高速化
whileやfor文内(括弧内の条件式含む)での計算やオブジェクト生成、try,catch等の例外処理をなるべく抑え、外に出せる分はきちんと出す。
if文内だけで実行すれば良い内容はif文の外に出さずに、if文内で処理する。
特定の関数内でしか使わない変数は関数の外で宣言しない。static等のクラス変数よりも関数内(スタック変数)の方がアクセスコストが小さい。
絶対に入ることのないような分岐を生成しない。a = 5; if(a==5) {} else{何かの処理等}
使わないオブジェクトをきちんとnull指定で破棄する。
コンストラクタで生成する必要の無いオブジェクトは作らない。 こうすることで、クラスのうち一部の変数しかアクセスしないプログラムを作ったとしても余計なオブジェクト生成をしなくて済む。 クラス全体で共有するのではなく、複数の関数でオブジェクトを共有するようになる。 それぞれの関数内ではif(オブジェクト名==null){ a = new オブジェクト();}のようにして生成するとよい。
if(条件A || 条件B)等の場合は条件A,条件Bのうち、falseになる確率が高い方を条件Aに書き、条件Bまで判定させない。
その他の高速化
計算したデータを配列などの変数になるべく保存しておき、再度計算しない(動的計画法。メモリを食うので、諸刃の剣)
定数宣言すると高速化する言語もある(java等はfinalを付けると早くなるが、他言語でconstをつけても早くならないとかも)
短い関数をインライン化する。
各コンパイラでサポートされている場合にはデフォルトで設定される変数は初期化しない(2度手間となるため)
オブジェクト型ではなく、プリミティブ型を使う(オブジェクト生成もコストが大きいため。Integer→intを使う。Vector等ではプリミティブ型使えないので注意)
プロファイラを使って、実行時間の長い関数を調べてみよう。
最終更新:2015年02月14日 23:50