Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Скорость инициализации переменных


Автор: VictorGr 29.7.2007, 18:38
Имею таймер,
который раз в секунду работает с WinAPI, HWND, ProcessID и проч. Использует переменные.

Подумал: а насколько быстра инициализация переменных? Ведь по сути у меня каждую секунду создаются переменные, с ними идёт работа, затем они уничтожаются.

А если их вынести наружу? В область модуля?

Их инициализация не будет происходить?

А если внутри функции использовать Static переменные?

Или вообще потери скорости настолько незначительные, что можно на них не обращать внимание?

Спасибо!

Автор: W4FhLF 29.7.2007, 18:56
Ну видел бы ты во что компилятор VB превращает элементарные операции, это ужас. Конечно здесь куча лишних "телодвижений", лучше вынеси. Прироста в скорости может и не ощутишь, но мне бы было приятней smile

Автор: Akina 29.7.2007, 20:03
Цитата(VictorGr @  29.7.2007,  19:38 Найти цитируемый пост)
насколько быстра инициализация переменных?

По сравнению с тем количеством тиков, которое потребуется, чтобы добраться до кода создания и инициализации переменной, сама эта процедура - сущие пустяки. Посему, если быстродействие критично, гораздо разумнее использовать переменные уровня модуля или даже уровня проекта. Однако следует строго следить за дублированием имен, потому как поиск таких "блох" - это сущий кошмар, особенно в асинхронных процедурах.
Статические переменные по скорости работы с ними ничем не отличаются от переменных уровня модуля - просто у них область видимости поуже.

Автор: JusTalionis 31.7.2007, 08:07
Раз в секунду - это абсолютно незаметное замедление при ЛЮБОЙ инициализации (исключая ожидание ответа устройств, конечно). Ты же не на 486 работаешь?..

По моим наблюдениям, скорости выполнения процедур приходится оптимизировать, если тебе требуются частоты выше 400 герц, или вычисления вставлены внутрь цикла.
(Например, у меня были траблы с созданием анимации, когда требуется быстро перерисовывать картинку, и лишние задержки отражаются на равномерности. И то, здесь больше сказывается сама работа Виндовс, чем построение VB-кода)

Автор: W4FhLF 31.7.2007, 09:00
Цитата(JusTalionis @  31.7.2007,  08:07 Найти цитируемый пост)
И то, здесь больше сказывается сама работа Виндовс, чем построение VB-кода


Ну если бы был виноват виндовс, то тормозило бы везде. Ты ещё не исключил один источник тормозов: реализацию алгоритма. 

Ещё, может ты под p-code компилировал. 

Автор: VictorGr 31.7.2007, 12:34
JusTalionis, я бы с удовольствием и каждый 100 мс. включал таймер, да только процесс при этом грузит проц на 20%.

Ежесекундная проверка -- на 1-4%.

Конечно, постараюсь ещё оптимизировать алгоритм. И обратил внимание на инициализацию переменных как на один из способов уменьшить задержки.

Автор: JusTalionis 2.8.2007, 14:46
Цитата(W4FhLF @  31.7.2007,  09:00 Найти цитируемый пост)
Ну если бы был виноват виндовс, то тормозило бы везде.
 А везде и тормозило. Я разные реализации попробовал - примерно одинаково, ну - на границе ощутимости разница.


Цитата(W4FhLF @  31.7.2007,  09:00 Найти цитируемый пост)
Ещё, может ты под p-code компилировал. 
 Да, под P. А как иначе в VB?
Если есть дельный совет - прошу ответ в мою тему http://forum.vingrad.ru/forum/topic-142799/view-all.html, не будем засорять тему Victorа посторонними обсуждениями.

Автор: JusTalionis 4.8.2007, 09:15
Цитата(VictorGr @  31.7.2007,  12:34 Найти цитируемый пост)
обратил внимание на инициализацию переменных 

Вообще, как я слыхал, наиболее быстрый доступ - к глобальным переменным, и типу Long. Но IMHO тебе это даст выигрыш не весьма ощутимый (если их не сотни штук).

Автор: Akina 5.8.2007, 22:01
Цитата(JusTalionis @  4.8.2007,  10:15 Найти цитируемый пост)
наиболее быстрый доступ - к глобальным переменным

Неверно, скорость доступа к существующей переменной практически не зависит от того, когда и где она была объявлена и проинициализирована.

Цитата(JusTalionis @  4.8.2007,  10:15 Найти цитируемый пост)
и типу Long

не для VB - тут нет регистровых переменных, все переменные ссылочные.

Автор: Tectoder 10.8.2007, 19:39
Вобщем, попытаюсь вкратце изложить свое менние.
Инициализация всех локальных переменных в процедуре это буквально две очень простые операции
1)измененеие одного регистра,  время на эту оперцию никак не зависит от числа пременных
2) обнуление непрерывной области памяти(эта операция по времени пропорциональна суммарной длине переменных, однако по сути она ничтожна)
Если переменные объявлены as new... то процедура инициализации такая же. Но при первом обращении происходит еще и создание объекта, про это то же не надо забывать.
Сама работа с локальными и глобальными переменными почти идентична. Разницы в скорости mov [imm] и mov [r-imm] почти нет.
Если только речь идет не о apartment-модели com-сервера. Если же модель такая, то работа с локальными переменными намного быстрее.
Раз в секунду это вообще мелочь, если как вроде бы было замечено ты не ждешь ответа от флоппика.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)