AB高速化計画

ABは遅い?

ActiveBasicを使っているとどうしても突き当たるのが速度の問題です。
最初の方でも書きましたが、三角関数などは、VBAにも負けてしまいます。
そこで当サイトでは1つの提案としてVCランタイムを使用しています。
しかし、これでは速度は出ますがABの魅力である、小サイズでランタイム不要という大きなメリットを失ってしまいます。
ABでは、1部の関数はコンパイラ組み込みですが、ソースのままの関数もあります。
ヘルプにインクルード ファイル: basic\function.sbp 内で定義済みなどと書いてあるのが、それです。
今回はこれらの関数を自分で書き換えることで、高速化を狙います。
今回の内容はバージョン4.21.00以外では異なるかもしれません。また、自己責任でおねがいします。

Time$,Date$

ActiveBasicではあまり用途は無いかもしれませんが、高速化の効果がすぐに、簡単に、出るのはこれだと思います。
この2つの関数はすでに答えが出ています。本家の講座、ステップ19にあります。
GetDateFormat関数とGetTimeFormat関数を使えば高速化できます。
#console

Function MyTime$() As String
    Dim buf[260] As Byte
    GetTimeFormat(LOCALE_USER_DEFAULT, _
        LOCALE_NOUSEROVERRIDE, ByVal 0, 0, buf, 255)
    MyTime$ = MakeStr(buf)
End Function

Dim cnt As DWord'カウンタ
Dim tim As DWord'タイマ
Dim T As String

'標準版
tim = GetTickCount() + 5000 ' 5秒
While tim > GetTickCount()
    T = Time$()
    cnt = cnt + 1
Wend
Print T , cnt

'高速版
cnt = 0
tim = GetTickCount() + 5000 ' 5秒
While tim > GetTickCount()
    T = MyTime$()
    cnt = cnt + 1
Wend
Print T , cnt
Time$しかやっていませんが、Date$も同じようになるでしょう。
当方の環境では実行結果は以下のようになりました。9倍以上です。
23:04:45        35971
23:04:50        336240

定数

インクルードファイルInclude\basic\function.sbpには、定数を計算しているものが見られます。
現在のABの最適化は弱いので、自分でこのような無駄を取り除くと、多少速くなります。
ただ、今後ABのバージョンアップによって効果がなくなるかもしれません。

181行目のExp関数にある、_System_LOG2+0.5は不変です。
1.193147180559945309417232121458です。_System_LOG2-0.5も同じく不変です。

267行目のAtn関数内の_System_PI/2も変わることはありません。
1.5707963267948966192313216916398です。

297行目の_Support_tan関数にも上と同じく_System_PI/2があります。
307行目の(CDbl(3217)/CDbl(2048))も変化しないでしょう。
1.57080078125です。

332行目のCos関数はSin(_System_PI/2-Abs(number))となっています。
公式Cos(@) = Sin(90-@)を使ってSin(1.5707963267948966192313216916398 - number)でも良いでしょう。

以上の方法は、長いループ内で効果が出ると思います。短いループではほとんど差は出ないはずです。

最後に一言

実際の問題として、どうしても速いコードが必要なら、VCやICCなどを使ったほうがいいです。
自分のプログラム(特にループ周り)を見直したほうが良いです。
ただ、ABの内部で何が起こっているのか、知るきっかけにはなるかもしれません。