
VBAを使っていてふと気づいたことなのですが、
x ^ 2とx * xは計算結果は全く同じなのですが、x * xの方が6倍程度速く計算することができます。
Sub test()
start_time = Timer
For j = 1 To 10000
For i = 1 To 1000
y = i ^ 2 * j ^ 2
Next
Next
zikan = Format(Timer - start_time, "0.00")
End Sub
というプログラムの計算時間が3.80秒なのに対し、
y = i ^ 2 * j ^ 2をy = i * i * j * jに書き換えて実行すると
0.66秒になります。
恐らく、x ^ 2とx * xで計算アルゴリズムが異なるからだと思うのですが、
一般的によく知られたことなのでしょうか?
また、どのようにアルゴリズムが異なるのでしょうか?
また、VB以外の他のプログラミング言語にも見られるのでしょうか?
ちなみに、
Function bekijou(x, y)
bekijou = 1
For q = 1 To y
bekijou = bekijou * x
Next
End Function
という関数を作って、
y = bekijou(i, 2) * bekijou(j, 2)で実行してみたところ、計算時間は更に伸びて、
9.47秒になってしまいました。
これ以外に意外と知られていない計算速度を上げるためのコツなどがありましたら
教えてください。
No.2ベストアンサー
- 回答日時:
昔からBASICは整数演算に比べて関数演算が遅いのが普通です。
関数演算は処理が複雑なものが多く、時間がかかるのに対して、整数演算は単純だからでしょう。
関数演算の場合は機械語では、確か、スタックにローカルバッファを作り、引数をスタック上に積み上げてから、関数の演算処理系を呼び出すという方法を使っているはずですし、関数の演算はサブルーチンの呼び出しがリカーシブ(再帰的)になっていたりなど、時間がかかる複雑な計算をおこなっている例が多いので、処理が遅くなります。
X=X*Xという公式は、機械語では1命令でも実行出来ますが、X=X^2という公式では、Xという変数をべき乗する数だけ演算を繰り返す処理系を使う必要があるので、処理が遅くなるはずです。
BASICを高速化するには、関数を出来るだけ使わずに整数演算に置き換えて計算させると速くなります。BASICの高速化に関しては以下のリンクを参照してみてください。
参考URL:http://ww5.tiki.ne.jp/~ochame/E500/TECH/basic4.htm
No.3
- 回答日時:
この現象は、別の開発言語でも起こります。
C/C++で掛け算を使用した場合とべき乗の関数powerを使用した場合の速度を比較したことがあります。
おそらく、べき乗の計算には級数展開が使用されているので、掛け算の数倍の計算が必要になるはずです。
No.1
- 回答日時:
y = i ^ 2 * j ^ 2
は、内部的に、
y = Exp(Log(i) * 2) * Exp(Log(j) * 2)
を計算している物と思います。
直接後者を書くより、前者から後者に変換する処理が入るのでさらに遅いようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
大規模疎行列の高速な計算方法...
-
べき乗の計算が遅い理由
-
変化させるセルが変化しない
-
EXCELなどで「返す」という表現
-
計算基礎論、クラスPであること...
-
バッチファイルでウインドウを...
-
ファイルの開き方
-
Bluestacks内でダウンロードし...
-
アルゴリズム フェルナンデス...
-
マージソートの比較回数の計算...
-
正しい五十音順について
-
自動クエリとはどういうもので...
-
銃を発砲するならともかく、日...
-
あるプログラムのコマンドライ...
-
書籍のソースコードを別言語に...
-
C++でアボート(Abort)で処理が...
-
C++ で、「)」が必要 というエ...
-
クリックするとページ内で説明...
-
VCでのunion REGSとint86について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
EXCELなどで「返す」という表現
-
matlabで計算終了
-
排他的論理和 BCC(水平パリテ...
-
変化させるセルが変化しない
-
モジュラス103の計算とは何でし...
-
傾いた四角形内の範囲の条件式
-
VBAで関数をつくる
-
[急募]Pythonについてです。
-
数値計算の高速化 (cos, sin, exp)
-
C言語についての質問です。 ル...
-
切り上げたい
-
DLL(VC++で作った)で稼動中の...
-
CとFORTRANの計算速度はどちら...
-
趣味で「乗換案内」みたいなソ...
-
CGIの実行権限(ディスク容...
-
エクセルで特定のセルのみを任...
-
functionを含んだプログラムを...
-
時間差を求める
おすすめ情報