VBAでオブジェクトの繰り返し定義による速度考察した話
CreateObject("Scripting.FileSystemObject")
CreateObject("WScript.Shell")
オブジェクトを使ったら後始末みたいな記述をよくみるので、なんとなく繰り返し呼び出すのは良くないと思っていた。
実際どんだけ遅くなんのよ?ってのが今回の話。
結論を先に書くと、
ほぼ線形で1万回呼び出すのに0.05秒程度だった。10万回でも0.5秒。
これならあんまり気にすることないね。
オブジェクト変数使うより、ズバッと一行で表記したほうが見やすいし。
シミュレーションに使ったソースと結果は以下の通り。1万回の結果は消してしまった。。。
Sub objtestFSO()
Dim i As Long, obj
Dim iMax As Long: iMax = 100000
Dim tictoc As Double
tictoc = Timer
For i = 1 To iMax
Set obj = CreateObject("Scripting.FileSystemObject")
Next i
Debug.Print Timer - tictoc & "秒 obj = FSO , iMax=" & iMax
End Sub
結果
0.541015625秒 obj = FSO , iMax=100000
0.525390625秒 obj = FSO , iMax=100000
0.537109375秒 obj = FSO , iMax=100000
0.537109375秒 obj = FSO , iMax=100000
0.54296875秒 obj = FSO , iMax=100000
Sub objtestWSH()
Dim i As Long, WSH
Dim iMax As Long: iMax = 100000
Dim tictoc As Double
tictoc = Timer
For i = 1 To iMax
Set WSH = CreateObject("WScript.Shell")
Next i
Debug.Print Timer - tictoc & "秒 obj = WSH , iMax=" & iMax
End Sub
結果
0.552734375秒 obj = WSH , iMax=100000
0.5390625秒 obj = WSH , iMax=100000
0.53125秒 obj = WSH , iMax=100000
0.544921875秒 obj = WSH , iMax=100000
0.57421875秒 obj = WSH , iMax=100000
Sub objtestFSOWSH()
Dim i As Long, WSH, fso
Dim iMax As Long: iMax = 100000
Dim tictoc As Double
tictoc = Timer
For i = 1 To iMax
Set WSH = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Next i
Debug.Print Timer - tictoc & "秒 obj = WSHFSO , iMax=" & iMax
End Sub
結果
1.095703125秒 obj = WSHFSO , iMax=100000
1.091796875秒 obj = WSHFSO , iMax=100000
1.099609375秒 obj = WSHFSO , iMax=100000
1.095703125秒 obj = WSHFSO , iMax=100000
1.150390625秒 obj = WSHFSO , iMax=100000