[Notes/Domino] Print文は遅い
※このエントリは旧コンテンツから移行したものです。(初出:2004/8/8)
文書の書き出し処理や取り込み処理などで、1件処理するごとにPrint文で処理件数を出力する、なんて処理はよくやると思います(わたしだけ?(^^; )。ところがこのPrint文、パフォーマンス的にはけっこう影響があるようです。
たとえば、以下のように単純な5万回のループでPrint文を処理したところ、わたしのマシンでは約60秒かかりました。
Dim i As Double Dim cnt As Double For i = 1 To 50000 cnt = cnt + 1 Print i Next
しかし、Print文をコメントアウトしたところ、1秒もかからずに一瞬で処理されました。
Dim i As Double
Dim cnt As Double
For i = 1 To 50000
cnt = cnt + 1
'Print i
Next
次に、If文を入れて100回ループするごとに1回Printするテストを行いました(つまりPrint文は500回だけ実行されます)。こちらは、上述のループだけの処理よりはさすがに時間がかかりましたが、それでも1秒以内で終了しました。If文を5万回処理するのは一見無駄に見えますが、Print文を5万回処理するよりはずっと速いというわけです。
Dim i As Double Dim cnt As Double For i = 1 To 50000 cnt = cnt + 1 If i Mod 100 = 0 Then Print i End If Next
では、実際の処理に近いロジックではどうでしょうか。以下の処理では、5000件の文書を作成し、5000回Print文を実行しています。この処理では、約15秒かかりました。
Dim ss As New NotesSession Dim db As NotesDatabase Dim newdoc As NotesDocument Dim i As Double Dim cnt As Double Set db = ss.CurrentDatabase For i = 1 To 5000 Set newdoc = db.CreateDocument newdoc.Form = "TestForm" Call newdoc.Save(True, True) Print i Next
次に、上記ロジックにIf文を加えて、Print文は100回に1度だけ処理されるように変更しました(つまりPrint文は50回しか実行されません)。このロジックでは、約8秒で処理が終了しました。Print文を5000回評価する時間は、新規文書を5000文書作る時間とほとんど変わらないという結果になりました。(もちろん、通信環境、マシンスペックにより結果は大きく変わると思いますが)
Dim ss As New NotesSession Dim db As NotesDatabase Dim newdoc As NotesDocument Dim i As Double Dim cnt As Double Set db = ss.CurrentDatabase For i = 1 To 5000 Set newdoc = db.CreateDocument newdoc.Form = "TestForm" Call newdoc.Save(True, True) If i Mod 100 = 0 Then Print i End If Next
以上のことから、Print文は意外と処理時間に影響するということが証明されたかと思います(ってまぁ描画処理だから当たり前か(^^; )。もし大量の文書を処理する場合で、進捗状況も表示したい場合は、100件に1回表示するなどの工夫をすると、処理時間が速くなるのが体感できると思います(1件1件の処理が軽ければ軽いほど効果があります)。
コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。