重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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秒になってしまいました。






これ以外に意外と知られていない計算速度を上げるためのコツなどがありましたら
教えてください。

A 回答 (3件)

 昔からBASICは整数演算に比べて関数演算が遅いのが普通です。



 関数演算は処理が複雑なものが多く、時間がかかるのに対して、整数演算は単純だからでしょう。

 関数演算の場合は機械語では、確か、スタックにローカルバッファを作り、引数をスタック上に積み上げてから、関数の演算処理系を呼び出すという方法を使っているはずですし、関数の演算はサブルーチンの呼び出しがリカーシブ(再帰的)になっていたりなど、時間がかかる複雑な計算をおこなっている例が多いので、処理が遅くなります。

 X=X*Xという公式は、機械語では1命令でも実行出来ますが、X=X^2という公式では、Xという変数をべき乗する数だけ演算を繰り返す処理系を使う必要があるので、処理が遅くなるはずです。

 BASICを高速化するには、関数を出来るだけ使わずに整数演算に置き換えて計算させると速くなります。BASICの高速化に関しては以下のリンクを参照してみてください。

参考URL:http://ww5.tiki.ne.jp/~ochame/E500/TECH/basic4.htm
    • good
    • 0

この現象は、別の開発言語でも起こります。


C/C++で掛け算を使用した場合とべき乗の関数powerを使用した場合の速度を比較したことがあります。

おそらく、べき乗の計算には級数展開が使用されているので、掛け算の数倍の計算が必要になるはずです。
    • good
    • 0

y = i ^ 2 * j ^ 2


は、内部的に、
y = Exp(Log(i) * 2) * Exp(Log(j) * 2)
を計算している物と思います。
直接後者を書くより、前者から後者に変換する処理が入るのでさらに遅いようです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!