2016-08-19 5 views
2

私はa,bおよびAです。プログラミングの実践:最初に変数を作成しないと計算が高速になりますか?

私のコードで
A = some expression 1 + some expression 2 

a = some expression 1 
b = some expression 2 
A = a + b 

、そこだけabではありませんが、それらの多く。最初に変数を作成せずに後のメソッドを使用すると、すなわち、Aのすべての式を合計するだけで、私のプログラムでは1秒も早くなります。合計は約11秒です。これは長いテストの後に確認されます。したがって、11秒から10秒に短縮されます。最初は変数を作成しないだけなのでしょうか?最初に変数を作成しないと計算が速くなりますか? 私は多くのループを実行してodeソルバーを実行し、長い計算をする必要があります。ループ内で変数が計算され、作成されます。もし私が約10%減ることができるなら、これは良いことです。

+1

私はMATLABで何が起こっているのかについて専門家ではありませんが、変数の割り当ては非常に高価な操作ではないと思います。式1と2はどれほど複雑ですか?質問を編集してそれらを含めることはできますか?その間に何もキャッシュされていないことを確認するために、各バージョンの間に 'clear;'コマンドを含めてください。 – eigenchris

+1

@eigenchris大きな行列です。計算は非常に複雑ですが、私は計算が両方のケースで実行される必要があると思います。 – kyle

+0

@eigenchrisいいえ、私は 'clear'コマンドを使用しませんでした。 – kyle

答えて

2

一般的に(MATLABだけでなく)。

最初のシナリオでは、これらの追加手順が必要です。これは2番目のシナリオには適用されません。

  1. 変数が作成されると、変数の値が格納される場所にメモリを割り当てる必要があります。
  2. 値がその変数に割り当てられると、その値はメモリ内の変数のスペースに書き込まれる必要があります。
  3. 計算が要求されると、各変数の値をメモリから取得する必要があります。

多くのコンパイラは、さまざまな手法を使用してこれらのオーバーヘッドを最適化しますが、多くの解釈言語では最適化されません。 (これは難しくて速いルールではないが、スマートな解釈言語や愚かなコンパイル済みのものがある)。

MATLABの内部の仕組みは正確に分かりませんが、それは と解釈されます。つまり、追加の手順で追加のオーバーヘッドが発生する可能性があります。

2番目のシナリオでの問題は、長期的には読みにくくメンテナンスが難しいことです。変数名を使用すると、計算や中間ステップを読みやすくなります。トリックはバランスのとれたパフォーマンスと読みやすさです。

+0

ありがとうございます。これをループで大量に行うと、時間はスケールアップされますか?私はいくつのループを実行するかとは無関係に同じままにしていますか?変数のサイズは変更されません。 – kyle

+0

ループ内に新しい変数を宣言すると、宣言のオーバーヘッドが有効になります。ループ内の変数に値を割り当てると、割り当てのオーバーヘッドなどが有効になります。言い換えれば、ループ内のコードが何であるかによって異なります。 – RudolphEst

+0

変数のサイズは変更されません。したがって、メモリのサイズは同じに維持する必要があります。時間コストは最初のループにのみ存在しますか? – kyle

0

パフォーマンスの点でどのくらいの違いがあるか分かりませんが、大きな違いはないと思います。おそらく数百分の1秒です。 tic toc関数を使用して自分でテストすることができます。

tic 
a = some expression 1 
b = some expression 2 
A = a + b 
toc 

VS

tic 
A = some expression 1 + some expression 2 
toc 

他の回答で述べたように、読みやすさが主な違いです。できるだけシンプルにコードを保持して、問題がある場合はどこにあるのか、うまくいけば問題があったのかを正確に知ることができます。

関連する問題