Takenoff Labs

Lotus Notes/Domino に関する Tips や、クラシックの名曲などを紹介します

[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件の処理が軽ければ軽いほど効果があります)。

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...

トラックバック

トラックバックはありません

コメント

コメントはありません

※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 1662 to the field below:

^
×