忍者ブログ

VBAでオブジェクトの繰り返し定義による速度考察した話

2023年10月10日
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





PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字