当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。

テクてく Lotus 技術者 Slack に参加しよう!

2015年2月17日火曜日

ループ処理の計測

こんにちは。

まぁ、とりあえずはボタンを押してってよ、話はそれからだ。
にほんブログ村 IT技術ブログへ
新しい記事じゃなくても、ページを開いたら押してってください。じゃないと、テンション下がるわ~。


さて・・・気を取り直して。
今日はちょっとした実験です。


LotusScriptでのループ処理ですが、すでに当ブログでも紹介しているように色々な記述方法があります。
多すぎるがゆえに、「どれを使えばいいんだ?」ということになりがちです。

ここは、実行速度を計って、どれが良いのかを見てみましょう。
計測するのはFor文、Do文、While文の3つ(他にもありますが、それは貴方が自分で計測して!)です。
ループ回数ですが、10回や100回くらいでは違いを見るのは難しそうと判断して、思い切って10,000,000回(1千万回!)にしてみました(笑)。

さらにループするだけだと、あっという間に終わるかもしれないので、ループ処理1回ごとに乱数を発生させるようにしました。

ソースはこちらです。   
Sub Click(Source As Button)
    Const LOOPCNT = 10000000
   
    Dim startDT1 As String
    Dim endDT1   As String
    Dim startDT2 As String
    Dim endDT2   As String
    Dim startDT3 As String
    Dim endDT3   As String
    Dim i        As Long
    Dim j        As Single
   
    startDT1 = Format( Now, "h:nn:ss" )
    For i = 1 To LOOPCNT
        j = Rnd
    Next
    endDT1   = Format( Now, "h:nn:ss" )
   
    i        = 0
    startDT2 = Format( Now, "h:nn:ss" )
    Do While i <= LOOPCNT
        i = i + 1
        j = Rnd
    Loop
    endDT2   = Format( Now, "h:nn:ss" )
   
    i        = 0
    startDT3 = Format( Now, "h:nn:ss" )
    While i <= LOOPCNT
        i = i + 1
        j = Rnd
    Wend
    endDT3   = Format( Now, "h:nn:ss" )
   
    Msgbox _
    "For  :" & startDT1 & " - " & endDT1 & Chr$(10) & _
    "Do   :" & startDT2 & " - " & endDT2 & Chr$(10) & _
    "While:" & startDT3 & " - " & endDT3, _
    0 + 64, "ループ処理の計測"
End Sub


このコードを実行した結果が下図です。
実行結果

何度か実行してみましたが、ほぼ同じ結果となりました。
つまり、LotusScriptにおいてはForループの方が速いということですね。
※すべての言語で同じ結果になるわけではありません。実際にC++やPHPだとWhileの方が速いという事らしいです。


ループ回数が決まっているのであれば、For文を使うと良いでしょう。
ループの数が不定となる場合だけ、Do文もしくはWhile文を使うと良いでしょう。




では、今日はこの辺で・・・





【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: