VB.NETはじめる(その6)

更新日:2003/2/5

多倍長計算 加算編 性能テスト

6.1 性能テスト結果

(1)性能テストフォーム

2/1付けで自作ものコーナーで公開したフォームを少し手直しした。
実行時間を測定できるようにした点と実行中は、マウスカーソルが砂時計の形状になるようにした点である。
その他、新しい測定の開始時にa(n)等がクリアされない点も改善した。

(2)実行時間の測定

これは、単純に測定開始時のNow()から次のように時間、分、秒を取得した。
hw1 = Hour(Now()) : mw1 = Minute(Now()) : sw1 = Second(Now())
終了時も同様に取得し、差を求めている。
この方法では、秒単位でしか求まらないが、今回の目的では十分である。

(3)マウスカーソルの形状を変える

こちらは、次の1行を開始時に追加した。
Cursor.Current = Cursors.WaitCursor
これで、砂時計状態になる。
解除は、Cursor.Current = Cursors.Default
となる。

(4)テキストボックス等をリフレッシュ

実行ボタンを押した後にフォームがリフレッシュされないため、a(n)等のテキストボックスの内容をクリアしても画面上は、変化が起きない。
変化させるためには、フォームをリフレッシュする必要がある。
TextBox7.Text = "実行中"
TextBox4.Text = ""
TextBox5.Text = ""
ActiveForm.Refresh()
上の最初の3行がテキストボックスをクリア等するための命令で、最後の1行がフォームをリフレッシュしこれらの結果をフォームに反映するためのものである。

6.2 性能テスト結果

いくつかのnとkの組み合わせで実行時間を測定し、エクセルで整理してみた。
時間は、a(n)を求めるまでの秒数である。

時間 k
n 1 2 3 4 5 6 7 8 9
1000 2 2 2 1 1 1 1 1  
2000 7 4 4 3 4 3 3 3  
3000 14 9 7 6 6 6 5 5  
4000 26 15 12 11 10 9 8 8  
5000 42 25 19 16 14 13 12 11  
10000   121 87 69 60 52 47 43  
20000     513 395 325 278   220 201

まとめて計算するという方法の効果は、かなり顕著である。
ただし、kがある程度大きくなるとその効果は、鈍ってくる。
ちなみに上記は、a等をIntegerで宣言している場合であるので、kは、9(10の9乗)までが限界であるが、Longで宣言して、k=14(10の14乗)で計算させても、時間はほとんど短縮されない。、

項数nと実行時間sとの関係を示すグラフ。(k=8の場合)

上図では、s=0.7x^2-2.7x+5.8が近似曲線であって、この範囲では、nの2乗に比例して実行時間がかかることになる。(xは、n/1000)
これによるとn=30000では、約560秒となる。これに対して、実測値は、628秒と少し、大きくなった。

項数nと桁数ketaとの関係を示すグラフ

桁数=0.209×項数の関係である。従って、項数が3万では、桁数が6270桁となる。
実際にテストした結果は、6270桁と数式通りとなった。

6.3 7万項まで計算

k=8でn=70000で計算させてみた。
所要時間は、3034秒、桁数は、14629桁となった。
ちなみに6.2の予測式からは、3246秒、14630桁となってほぼ、予測の範囲内となっている。
自作ものに掲載してあるプログラムでは、この範囲を超えるnを入力するとエラーメッセージがポップアップする。
しかし、数値配列は、1万項で宣言してあるので、k=8では、桁数が8万までは、計算可能である。
この際のnは、約38万となって、この程度までは、計算可能となる。この場合の計算に要する時間は、予測式では、24時間を超えることになる。

VB.NETはじめるに戻る