Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Мысли. CreateObject, Dictionary, Collection Добавлено: 19.12.09 03:27  

Автор вопроса:  Winand | Web-сайт: winandfx.narod.ru
Оказывается чтение из Dictionary (входит в Scripting Runtime) происходит быстрее, чем из Collection.
При сортировке QuickSort чтение данных используется при сравнениях. Так вот одна только замена коллекции на дикшенери ускорила сортировку с 500-600мс до 200-300мс.

Но больше я удивился, когда выяснилось, что такое объявление
Private items As Object
Set items = CreateObject("Scripting.Dictionary")

тормозит ту же сортировку почти вдвое по сравнению с таким
Private items As Dictionary
Set items = New Dictionary


Ну это собственно всё, что у меня было сказать)

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #1 Добавлено: 19.12.09 10:24
Компилятор вб6 штука раритетная, мож сказать музЭйный экспонат :-), там не тока с объявлениями, там почти со всем чудеса происходят.

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 21.12.09 10:09
Ну, наверное, нужно сперва что-нибудь почитать про раннее и позднее связывание. И по ходу вкурить что есть IUnknown и IDispatch.

Ответить

Номер ответа: 3
Автор ответа:
 VerhoLom



Вопросов: 20
Ответов: 285
 Профиль | | #3 Добавлено: 21.12.09 10:54
А такое объявление:

Private items As New Dictionary

может дать еще больше скорости

Ответить

Номер ответа: 4
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #4 Добавлено: 21.12.09 10:56
vbman, за счет чего?

Ответить

Номер ответа: 5
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #5
Добавлено: 21.12.09 18:54
>Проверка ссылок на СОМ-объекты в программе еще на этапе разработки, а не в период выполнения, как при позднем связывании (late binding).
В принципе логично, что ранее быстрее работает, раз программа заранее знает с чем будет иметь дело.

Что такое IDispatch, IUnknown толком понять не смог. Знаю только, что "I" is for Interface)

Ответить

Номер ответа: 6
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #6 Добавлено: 21.12.09 20:39
LOL я уже забыл когда читал про лэйтбиндинг.
Ты же знаешь, что компилятор действительно с тараканами :)

Ответить

Номер ответа: 7
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #7 Добавлено: 22.12.09 12:07
Поясню на пальцах.
Когда программа работает с типизированным объектом - мы имеем непосредственный доступ к его мемберам через VTBL - в результате чего прямой вызов происходит относительно быстро.
При объявлении как Object и последующим связыванием вызовы происходят через метод Inovoke интерфейса IDispatch - отсюда все прелести, влючая промежуточные вызовы, вариантарги и прочий мусор.
Резюме:
1.
  1. Private items As Object

Медленный вызов через Invoke с вариантными параметрами. Удобно для скриптописателей, в программе использоваться должно крайне редко - лишь в случаях бинарной несовместимости.
2.
  1. Private items As Dictionary
  2. Set items = New Dictionary

Имеем прямой вызов метода через VTBL. Быстро, типизированно. Один недостаток - необходима совместимость интерфейсов (и, соответственно, reference в проекте). В противном случае можно облажаться уже на этапе QueryInterface. Если регламент работы с интерфейсами соблюдается - самый оптимальный вариант.
3.
  1. Private items As New Dictionary

В принципе то же что и вариант 2 - но использовать по эстетическим причинам не рекомендуется. Резон простой - программист должен знать когда объект создается и когда уничтожается (конструктор/деструктор). В случае Set конструктор вызывается немедленно, в случае New - по факту инициализации переменной при первом обращении. Прирост в скорости может дать лишь в одном случае - если как New создаются неиспользуемые объекты (к сожалению, VB6 не выдает на этот счет никаких предупреждений, в отличие от того же C++), чего в нормальной программе быть не должно. Использовать не рекомендую.
Ну, это вкратце. Зарываться не буду, ибо слегка не трезвый :) Кому интересно - просто почитайте азы COM.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам