Принято считать, что использование конструкции типа Dim dict As New Dictionary
хуже по производительности, чем Dim dict As Dictionary / Set dict = New Dictionary
.
Объяснение состоит в том, что в первом примере - автоматическое создание экземпляра - создание экземпляра откладывается до первого использования переменной dict
. Таким образом, каждый раз, когда делается ссылка на dict, скомпилированный код должен сначала проверить, равно ли dict
Nothing.
Но мне приходит в голову, что скомпилированный код все равно делает это. Вы получите сообщение об ошибке каждый раз, когда попытаетесь использовать ссылку на объект, которая имеет значение Nothing
.
Итак, отдавая дань уважения науке, я провел несколько тестов. Результаты показывают, что между двумя подходами нет разницы в производительности. (Запуск в Excel 2007)
Вызовите «Создать словарь и добавить 2 элемента» 100 000 раз.
Обратный порядок тестовых вызовов:
Вызов «создать словарь и добавить 6 элементов» 100 000 раз.
Создание словаря и добавление 100 000 элементов.
Создать словарь и добавить 1 000 000 элементов.
Я не вижу ничего, указывающего на то, что автоматическое создание экземпляров работает плохо отношение к явному экземпляру. (Для ясности, по другим причинам я бы избегал автоматического создания экземпляров, но меня здесь интересует только угол производительности.)
Так это миф?
ОБНОВЛЕНИЕ
Позвольте мне объяснить, почему аргумент производительности не имеет для меня смысла. Говорят, что
x.Add("Key", "Item")
в автоматически созданном объекте эквивалентно следующему:
If x is Nothing then
Set x = New Dictionary
End If
x.Add("Key", "Item")
, что делает его похожим на «пугающие накладные расходы», если вы вызываете это тысячи раз. Но в случае явного создания экземпляра это именно та форма логики, которая сгенерирована в скомпилированной версии кода:
If x is Nothing Then
Err.Raise "Object variable not set..."
End If
x.Add("Key", "Item")
Из этого не обязательно следует, что auto длиннее, поэтому я спрашиваю, была ли правда в этом . Интересно, идентифицировал ли я еще один из многих непроверенных мифов о производительности.