Приветствую! В одном из моих проектов возникла необходимость хранить в памяти несколько небольших одинаковых по полям табличек и очень часто получать из них информацию по индексам. То есть, вводные данные — 3 числа: номер таблицы, номер строки, номер столбца.
Решил проверить, что быстрее и делюсь с вами(Планета и Кибер).
Часть 1. 1D массив с 2D массивами или один 2D массив. Второй вариант в 2 раза быстрее.
Код
Option Base 1
Option Explicit
Option Private Module
'==================================================================================================
Private Sub Test_TypeOfSafe()
Dim a(), aa(), a2D_Full(), aKoef&()
Dim t!, r&, c&, n&, m&, p&
Const rA& = 3, cA& = 2, mult& = 10, nCyc& = 100000000 ' 100 mln
' Prepare ===========================================================
' Arr2D =========================================
ReDim a(rA, cA)
For c = 1 To UBound(a, 2)
For r = 1 To UBound(a, 1)
a(r, c) = 10 * r + c
Next r
Next c
' Arr1D with Arr2D ==============================
ReDim aa(mult)
For n = 1 To UBound(aa)
aa(n) = a
Next n
' Full Arr2D ====================================
ReDim aKoef(mult)
ReDim a2D_Full(mult * rA, cA)
For n = 1 To mult ' 1 2 3 4 5 6 7 8 9 10
aKoef(n) = rA * (n - 1) ' 0, 3, 6, 9, 12, 15, 18, 21, 24, 27
For c = 1 To UBound(a, 2)
For r = 1 To UBound(a, 1)
a2D_Full(aKoef(n) + r, c) = a(r, c)
Next r
Next c
Next n
' Speed Test ========================================================
' ArrArr ========================================
t = Timer
For n = 1 To nCyc
p = aa(mult)(rA, cA)
Next n
Debug.Print "ArrArr", Format$(Timer - t, "0.0"), p ' 3.4 | 32
' a2D_Full ======================================
t = Timer
For n = 1 To nCyc
p = a2D_Full(aKoef(mult) + rA, cA)
Next n
Debug.Print "a2D_Full", Format$(Timer - t, "0.0"), p ' 1.7 | 32
' Show Arrays =======================================================
'Worksheets.add
'Cells(1, 1).Resize(UBound(a, 1), UBound(a, 2)).Value2 = a
'Cells(1, 2 + UBound(a, 2)).Resize(UBound(a2D_Full, 1), UBound(a2D_Full, 2)).Value2 = a2D_Full
End Sub
'==================================================================================================
'==================================================================================================
'==================================================================================================
'==================================================================================================
В дальнейшем планирую проверить скорость ENum и User Defined Type — для превращения безликих индексов в осмысленные параметры.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
МатросНаЗебре, всё верно и, в целом, ожидаемо. Просто не думал, что аж в 2 раза (ровно)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄