
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 物理学 二つの光時計 2 2022/06/02 16:32
- 公認会計士・税理士 会計学初心者です。 xeroという会計ソフトを実際に使用して決算整理仕訳?を行うという課題が出ました 1 2022/10/07 14:57
- Google Drive スプレッドシートの時間(分、秒)の足し算SUM関数がうまくいきません。 3 2022/09/08 16:39
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
電卓作成(緊急です!!)
-
チューリングマシンの状態数に...
-
円形ボリュームのUIの実装方法
-
65536は2の何乗なのでしょうか?
-
functionを含んだプログラムを...
-
エクセルVBAでゴールシークの C...
-
matlabで複数条件のif文を行列...
-
ガウス積分について
-
単価や利率などを設定画面を設...
-
タクシー料金の問題です
-
小数のべき乗の計算
-
HSPプログラミング 斜方投射ア...
-
C言語で
-
万年暦を導き出すプログラミング
-
タイムカードの夜間勤務時間
-
androidのダイアログに関して
-
IF構文の確認依頼/FalseTrue解...
-
時間差を求める
-
VBAでの拡散計算
-
この問題を解くために写真のよ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
エクセルで特定のセルのみを任...
-
CとFORTRANの計算速度はどちら...
-
モジュロ
-
バッチファイルでウインドウを...
-
Visual C++でdebugとreleaseで...
-
y=(x^2 +3x+1)^4を微分の定義を...
-
入射角反射角
-
スレッド処理からダイアログを...
-
60進数の四則計算
-
Javaと他言語比較について
-
VBAで関数をつくる
-
C言語 Σをつかったプログラム
-
CRC8を教えてください
-
C言語についてです。 再帰を使...
-
C言語について 下の画像は do-w...
おすすめ情報