C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

VBAのリスト問題5

こちらの続きです。
VBAのリスト問題4 - C#ATIA

いよいよ先人の方々が作られたものを試す事にします。
githubで見ても、結構な数が公開されていますね。いかに他の方々も
悩まれているというか、不満に思っているかが分かります。

多すぎて、とても全ては試せませんね。
チラチラっと見た感じですが、中身はCollectionのものと配列のもの
がありました。・・・個人的にはCollectionの利用は考えないけど。

で、とりあえずこちらを試す事としました。
GitHub - nanbu/XArray: Array class for VBA
中は配列で、1クラスにまとまってますし、日本人の方だったので
親近感がありました。

もう一つは、過去に試した事があるariawaseです。
GitHub - vbaidiot/ariawase: Ariawase is free library for VBA cowboys.
・・・9年前かな?
一緒に公開されている "vbac.wsf" ばかりが目につきますが、
ariawaseは本当にすごいです。僕の知る限り、VBAのライブラリ
としては桁違いに高水準のものです。
但し、困るのはHelpらしきものが無いので、理解しきれない。

前回のものも含めてこんな感じでテストです。

vba

Option Explicit

Private sw_ As StopWatch

Sub Custom_Array_test()

    Dim count As Long
    count = 500000
 
    Set sw_ = New StopWatch
    
    'XArray
    sw_.start
    Debug.Print "-- xArray--"
    
    Call test_xarray(count)
    Call sw_.total("Total" & ":")

    'ariawase
    sw_.start
    Debug.Print "-- ariawase --"
    
    Call Ext.ArrRange(0, count)
    Call sw_.total("Total" & ":")
    
    'preserve一度で
    sw_.start
    Debug.Print "-- 一度で--"

    Call preserve_once(count)
    Call sw_.total("Total" & ":")

    sw_.start
    Debug.Print "-- 毎回 --"
    
    Call preserve_every_time(count)
    Call sw_.total("Total" & ":")

End Sub

Private Sub test_xarray( _
    ByVal count As Long)
    
    Dim xArr As Object
    Set xArr = New XArray
    
    Dim i As Long
    For i = 0 To count - 1
        Call xArr.Add(i)
    Next
    
End Sub

Private Sub preserve_once( _
    ByVal count As Long)
    
    Dim ary() As Long
    ReDim ary(count)
    
    Dim i As Long
    For i = 0 To count - 1
        ary(i) = i
    Next
    
End Sub

Private Sub preserve_every_time( _
    ByVal count As Long)
    
    Dim ary() As Long
    
    Dim i As Long
    For i = 0 To count - 1
        ReDim Preserve ary(i)
        ary(i) = i
    Next
    
End Sub

結果はこちら

-- xArray--
Total:7.953125s
-- ariawase --
Total:1.421875s
-- 一度で--
Total:0.0234375s
-- 毎回 --
Total:0.8125s

おっと意外。毎回ReDim Preserveの方が、ariawaseより
速いですね。でも、ariawaseはあの1行だけで済むんですよね。