5章 要素モデルの計算速度調整
〜 インスタンスの生成(new)の影響 〜
(3)ローカル変数のnew
クラスや変数の new
(インスタンスの生成) は 時間がかかります。 特に大きなメモリー領域を new
する時に(PCの搭載メモリーにも依存しますが)顕著です。
プログラム中の 変数の new
の影響を調べるため Calculate()メソッド内、及び DataFusion( )
メソッド内で ローカル変数に3次元配列を生成します。
それ以外の処理は何もしません。
// 変数の new
の影響を調べる為のコーディング |
// 変数の new
の影響を調べる為のコーディング |
変数 |
計算時間(秒) |
ローカル変数使用の場合 |
177秒 |
メンバー変数使用の場合 |
<2秒 |
(ガーベージコレクション)
C++の世界では 確保した領域は プログラムの中で明示的に 開放する必要があります。 ( new / delete )
一方、C#やJAVAはガーベージコレクションという機能があり、不要となった領域は自動的にVMが開放してくれます。
明示的に new しなくても new が行われることがあります。
例えば、 CommonMP固有のクラス:HySTime
の演算子を使用した場合です。
例えば、 HySime A; HySTime B; HySTime C;
がある時
A = B + C;
の様に演算子を用いると 内部で new が動作してしまいます。
演算子を使用せずに 以下の様にコーディングすると、 new は使用されません。
A.SetTime(B.GetTime() +
C.GetTime());
CommonMP 独自クラスで、 +、−、==、!= 等の演算子が使用されている場合には、 内部で new
が行われていると思い、それを使用しないで同様の操作を行う別なメソッドを使用するほうが速度は早くなります。(演算中に使用するのは HySTime クラス
が多いと思いますが。)
下のコーディングで HySTime の演算子の影響を調べてみます。
// 演算子
の影響を調べる為のコーディング |
変数 |
計算時間(秒) |
演算子を使用する場合 |
87秒 |
演算子を使用しない場合 |
7秒 |
初版:2013/06/27 |