Рик Слэдки отлично вписался!Предыдущие тесты прокручивают один и тот же массив сначала «по строкам», а затем «по столбцам».Ниже приведен правильный тест, который выполняет те же операции над массивом и его транспонированием.В этом случае мы можем видеть, что на самом деле есть издержки на вызов For, и второй метод немного быстрее.Это определенно незаметно, если мы прокручиваем массив «по столбцам», что дает время вычисления большего порядка.Я не знаю подробностей о массивах CLI и почему это поведение процессоров, но это доказательство.
Structure mt
Dim m() As Double
End Structure
Sub Main()
Dim a, b As Integer
Dim p As Integer = 10000000
Dim q As Integer = 5
Dim m1(p, q) As Double
Dim m4(q, p) As Double
'Dim m2()() As Double
'Dim m3() As mt
'ReDim m2(p)
'For a = 1 To p
' ReDim m2(a)(q)
'Next
'ReDim m3(p)
'For a = 1 To p
' ReDim m3(a).m(q)
'Next
Dim sw As New Stopwatch
sw.Restart()
For a = 1 To p
For b = 1 To q
m1(a, b) = 0
'm2(a)(b) = 0
'm3(a).m(b) = 0
Next
Next
sw.Stop()
Console.WriteLine("Small loop in large loop: " & sw.Elapsed.ToString())
sw.Restart()
For a = 1 To q
For b = 1 To p
'm1(b, a) = 0
'm2(b)(a) = 0
'm3(b).m(a) = 0
m4(a, b) = 0
Next
Next
sw.Stop()
Console.WriteLine("Large loop in small loop: " & sw.Elapsed.ToString())
Stop
End Sub