無駄な計算を無くす

高速化プログラミング   
トップ  >  演算数と高速化  > 無駄な計算を無くす

無駄な計算を無くす

■ 概要

数値解析のプログラムを作るときは通常教科書や論文から式を引用してコーディングします。式は間違っていないなら、そのまま書いてもまず間違いないでしょう。ただ何も考えずにそのままコーディングするのは高速化プログラミング上好ましくありません。教科書や論文の式は正しい式を提供することが使命であり、コンピューターが速く計算できるような式を提供することではありません。コンピューターが高速に計算できるように書き換えるのはプログラマーの使命です。

そこでどうすれば高速に計算できるコードを書けるかが問題です。簡単に言えば、極力余計な計算をコンピューターにさせないこと。プログラマーで計算できる部分はきちんと計算してから、コードに写します。例えばy=5!*x(ここに!は階乗を表します)を計算したいときは、面倒ですが、5!の部分を手計算して5!=5*4*3*2*1=20なのでy=120*xに書き換えてから、コーディングするべき。またy=2/7*xどうでしょう。高速プログラミングをするなら、電卓でもたたいて2/7の部分を計算してy=0.2857142857142857*xにした方が望ましいです。0.2857142857142857は解かりにくいから抵抗があるかもしれませんが、コンピューターはすぐ計算に使えるという意味で2/7より0.2857142857142857の方が解かりやすいです。人間にも解かりやすくしたいなら、コメントを添えればいいです。例えば、C言語なら

y=0.2857142857142857*x      // y=2/7*x
と書けば、人間にも解かりやすいし、高速化プログラミング上も問題ありません。

y=2/7*xよりy=0.2857142857142857*xということを上に述べましたが、実際に両方をコーディングし実行してみると実は両方には差がないという結果を得るでしょう。前者の方が明らかに演算数が多いですが、なぜ計算時間は同じでしょうか。理由はコンパイラーが賢いからです。実はコンパイラーには最適化機能があり、コンパイルするときはコンパイラーは自動的に前者を後者に書き換えてくれます。上の例ならy=2/7*xと書いてもいいというわけです。しかし管理者はあえてy=0.2857142857142857*xをお勧めします。理由は

  • 最適化機能はどこまで最適化してくれるか解かりません。使用しているコンパイラーの最適化機能の性能を調べるよりは、上の例のように自分で書き換えた方がはるかに楽です。
  • 最適化機能はコンパイラーによっては違います。どのコンパイラーでも高速に実行できるようにコンパイラーの最適化機能を頼らない方が理想です。
  • 最適化するためにやはり幾度時間がかかります。
  • 常に高速化プログラミングをするように意識すれば、おのずと力がついて、そのうちにコンパイラーの最適化機能を上回る力が身に付きます。

下記のサンプル1は上の例をちょっと変形させただけですが、コンパイラーの最適化機能が働かなくなったことを確かめられます。ましてはその後のサンプルはコンパイラーの最適化機能を期待するのは無理でしょう。

■ サンプル

○ Sample 1: 無駄な演算

- C
- FORTRAN

○ Sample 2: 不要な割り算

- C
- FORTRAN

○ Sample 3: 因数分解の利用

- C
- FORTRAN

○ Sample 4: 乗数の乗数

- C
- FORTRAN



はじめに

演算数を減らす

メモリジャンプを減らす

高性能のアルゴリズム

その他



3 5 2 9 3 6