こちらの続きです。
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行だけで済むんですよね。