Является ли низкая производительность автоматического создания экземпляров Excel VBA мифом?

Принято считать, что использование конструкции типа Dim dict As New Dictionary хуже по производительности, чем Dim dict As Dictionary / Set dict = New Dictionary .

Объяснение состоит в том, что в первом примере - автоматическое создание экземпляра - создание экземпляра откладывается до первого использования переменной dict . Таким образом, каждый раз, когда делается ссылка на dict, скомпилированный код должен сначала проверить, равно ли dict Nothing.

Но мне приходит в голову, что скомпилированный код все равно делает это. Вы получите сообщение об ошибке каждый раз, когда попытаетесь использовать ссылку на объект, которая имеет значение Nothing .

Итак, отдавая дань уважения науке, я провел несколько тестов. Результаты показывают, что между двумя подходами нет разницы в производительности. (Запуск в Excel 2007)

Вызовите «Создать словарь и добавить 2 элемента» 100 000 раз.

  • Явный: 16 791 мс / Авто: 16 797 мс (Авто на 94 мс быстрее)
  • Явный: 16 797 мс / Авто: 16 781 мс (Авто на 16 мс быстрее)

Обратный порядок тестовых вызовов:

  • Авто: 16 766 мс / явное: 16 812 мс (автоматическое на 46 мс быстрее)
  • автоматическое: 16 828 мс / явное: 16 813 мс (явное на 15 мс быстрее)

Вызов «создать словарь и добавить 6 элементов» 100 000 раз.

  • Авто: 17 437 мс / Явное: 17 407 мс (Явное на 30 мс быстрее)
  • Авто: 17 343 мс / Явное: 17 360 мс (Автоматическое на 17 мс быстрее)

Создание словаря и добавление 100 000 элементов.

  • Авто: 391 мс / Явно: 391 мс (то же самое)

Создать словарь и добавить 1 000 000 элементов.

  • Авто: 57 609 мс / Явное: 58 172 мс (Авто на 563 мс быстрее)
  • Явное: 57 343 мс / Авто: 57 422 мс (Явное на 79 мс быстрее)

Я не вижу ничего, указывающего на то, что автоматическое создание экземпляров работает плохо отношение к явному экземпляру. (Для ясности, по другим причинам я бы избегал автоматического создания экземпляров, но меня здесь интересует только угол производительности.)

Так это миф?

ОБНОВЛЕНИЕ

Позвольте мне объяснить, почему аргумент производительности не имеет для меня смысла. Говорят, что

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 длиннее, поэтому я спрашиваю, была ли правда в этом . Интересно, идентифицировал ли я еще один из многих непроверенных мифов о производительности.

12
задан Community 9 July 2018 в 19:34
поделиться