Страница: 1 |
Страница: 1 |
Вопрос: Мысли. CreateObject, Dictionary, Collection
Добавлено: 19.12.09 03:27
Автор вопроса:
Winand | Web-сайт:
Оказывается чтение из Dictionary (входит в Scripting Runtime) происходит быстрее, чем из Collection.
При сортировке QuickSort чтение данных используется при сравнениях. Так вот одна только замена коллекции на дикшенери ускорила сортировку с 500-600мс до 200-300мс.
Но больше я удивился, когда выяснилось, что такое объявление
Set items = CreateObject("Scripting.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-сайт:
Профиль | | #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.
Медленный вызов через Invoke с вариантными параметрами. Удобно для скриптописателей, в программе использоваться должно крайне редко - лишь в случаях бинарной несовместимости.
2.
Имеем прямой вызов метода через VTBL. Быстро, типизированно. Один недостаток - необходима совместимость интерфейсов (и, соответственно, reference в проекте). В противном случае можно облажаться уже на этапе QueryInterface. Если регламент работы с интерфейсами соблюдается - самый оптимальный вариант.
3.
В принципе то же что и вариант 2 - но использовать по эстетическим причинам не рекомендуется. Резон простой - программист должен знать когда объект создается и когда уничтожается (конструктор/деструктор). В случае Set конструктор вызывается немедленно, в случае New - по факту инициализации переменной при первом обращении. Прирост в скорости может дать лишь в одном случае - если как New создаются неиспользуемые объекты (к сожалению, VB6 не выдает на этот счет никаких предупреждений, в отличие от того же C++), чего в нормальной программе быть не должно. Использовать не рекомендую.
Ну, это вкратце. Зарываться не буду, ибо слегка не трезвый :) Кому интересно - просто почитайте азы COM.