Какой способ записи массива лучше (стоимость процессора)? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть большой сложный скрипт VBA, который я написал для работы.Я нахожусь в процессе очистки и заметил, что могу определить свой массив так, чтобы швы выглядели более динамично, чем я это делал.

Первоначально я определял свой массив как строку следующим образом:

Dim header_arr(6) As String
Dim header_arr_2(4) As String

header_arr(0) = "esn"
header_arr(1) = "vin"
header_arr(2) = "last gps update time"
header_arr(3) = "status"
header_arr(4) = "account name"
header_arr(5) = "vehicle #"

header_arr_2(0) = "esn"
header_arr_2(1) = "vin"
header_arr_2(2) = "last gps update time"
header_arr_2(3) = "status"
header_arr_2(4) = "vehicle #"

Затем я стал играть с тем, как назначить массив, и сумел уменьшить его до:

Dim header_arr

header_arr = Array("esn", "vin", "last gps update time", "status", "account name", "vehicle #")
' Function call with this first Array

header_arr = Array("esn", "vin", "last gps update time", "status", "vehicle #")
' Function call with this second Array

Мой вопрос такой:

Я знаю, что для этогоПростая часть сценария: стоимость процессора не релевантна, но для гораздо большего массива Array какой метод записи массива является самой низкой стоимостью процессора, если вообще есть какая-либо разница?

Я не смог найти много различий в производительностимежду различными методами определения массива.

1 Ответ

0 голосов
/ 24 сентября 2018

Хорошо, я сделал тест с массивом вариантов и с массивом строк.Пусть оба запускаются несколько раз, и кажется, что версия с нетипизированным массивом еще немного быстрее.

Но более важный урок: сама обработка строки (а это довольно простая задача, конкатенация строки и числа) потребляет 75% времени выполнения - поэтому тип данных самого массива на самом деле неВопрос.

Дополнительное замечание: передача массива в подпрограмму по ссылке 1000 раз была настолько быстрой, что я не мог измерить ее.Передача его Вэл убила моего превосходства.Но передача массива по значению почти наверняка не то, что вы не хотите делать.

Я использовал следующий код:

Option Explicit

Private mlngStart As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long

Const size = 3000000

Dim startTime As Long
Public Sub StartTimer()
    startTime = GetTickCount
End Sub

Public Function EndTimer() As Long
    EndTimer = (GetTickCount - startTime)
End Function


Sub b1()

    StartTimer
    Dim i As Long
    Dim s(size)
    For i = 1 To size
        s(i) = "ABC"
    Next i
    Debug.Print "untyped, size = " & size, EndTimer
End Sub

Sub b2()
    StartTimer
    Dim i As Long
    Dim s(size) As String
    For i = 1 To size
        s(i) = "ABC"
    Next i
    Debug.Print "as string, size = " & size, EndTimer
End Sub

Результат был

untyped, size = 3000000      312 
untyped, size = 3000000      313 
untyped, size = 3000000      313 
untyped, size = 3000000      297 
untyped, size = 3000000      313 
as string, size = 3000000    328 
as string, size = 3000000    313 
as string, size = 3000000    328 
as string, size = 3000000    344 
as string, size = 3000000    313 

Я изменил назначение на s(i) = "ABC" & i и получил следующий результат:

untyped, size = 3000000      922 
untyped, size = 3000000      953 
untyped, size = 3000000      938 
untyped, size = 3000000      1015 
untyped, size = 3000000      953 
as string, size = 3000000    1140 
as string, size = 3000000    1156 
as string, size = 3000000    1157 
as string, size = 3000000    1125 
as string, size = 3000000    1125 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...