Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизКак заставить подпрограмму считать быстрее Найти похожие ветки
← →
TStas (2010-03-16 21:04) [0]Есть подпрограмма, которая должна выполнять достаточно интенсивный счёт. Правильно ли я понимаю, что поскольку адресация переменных в подпрограммах относительная, что и подтверждает просмотр ассемблерного кода, написанного Дельфями, если я вместо локальных переменных буду использовать глобальные, например, локальные переменные модуля (но не класса, ибо они тоже относительные, просто от Self отсчитываются), то тогда считать должно быстрее, притом намного? Ведь при каждом обращении к локальной переменной подпрограммы просисходит вначале вычисление её адреса, то есть дополнительное сложение. Это всё так?
← →
Loginov Dmitry © (2010-03-16 21:13) [1]Используй локальные и глобальные переменные там, где им положено быть.
А использовать глобальные переменные для "ускорения" - сомнительная идея.
Можно использовать ассемблерные вставки (какой-то процент ускорения это должно дать), можно оптимизировать логику алгоритма, можно оптимизировать код программы с учетом особенностей кэширования процессора (действия по сути простые, но можно добиться 4-х кратного ускорения).
← →
sniknik © (2010-03-16 21:17) [2]можно очень ускорить подпрограмму если дать ее писать программисту...
+ можно ускорить изменив алгоритм "расчета", выкинув например его(/часть) нафиг.
все остальное это экономия на спичках... особенно попытки "оптимизировать" адресацию и размещение переменных.
← →
Loginov Dmitry © (2010-03-16 21:18) [3]Неплохая литература по оптимизации:
Крис Касперски. Техника оптимизации программ. Эффективное использование памяти.
← →
Dimka Maslov © (2010-03-16 21:27) [4]mov eax, [esp+8] это не есть дополнительное сложение
← →
TStas (2010-03-16 21:39) [5]Спасибо, особенно (3)
← →
sniknik © (2010-03-16 21:51) [6]вот ведь... почему то всегда выбирают неподходящее к условиям, заумное, вместо простого и эффективного.
будет похоже теперь свой менеджер памяти к дельфе писать, "родной" то "неэффективный". а задачу видать второго наймут делать.
← →
Игорь Шевченко © (2010-03-16 21:52) [7]автор, ты на военных работаешь ?
← →
Дмитрий Белькевич (2010-03-16 22:45) [8]
> все остальное это экономия на спичках... особенно попытки
> "оптимизировать" адресацию и размещение переменных.
У меня где-то 10-15% получалась разница. За счет уменьшения косвенных вызовов. Экспериментировал как-то по скорости с pas vs asm. Но, как ты и сказал - экономия на спичках. Улучшение алгоритма может дать ускорение на порядки. Всё остальное - от сильно нефиг делать.
← →
Petr V. Abramov © (2010-03-16 22:57) [9]
> Дмитрий Белькевич (16.03.10 22:45) [8]
> У меня где-то 10-15% получалась разница. За счет уменьшения
> косвенных вызовов.
в каких годах?
вроде б (?) на современных пнях это пофигу
← →
Pavia © (2010-03-16 23:35) [10]
> Loginov Dmitry © (16.03.10 21:18) [3]
> Неплохая литература по оптимизации:Крис Касперски. Техника
> оптимизации программ. Эффективное использование памяти.
Только к моменту выхода она уже устарела лет на 5 в большей степени.
> Petr V. Abramov © (16.03.10 22:57) [9]
> > Дмитрий Белькевич (16.03.10 22:45) [8]> У меня где-то
> 10-15% получалась разница. За счет уменьшения > косвенных
> вызовов.в каких годах?вроде б (?) на современных пнях это
> пофигу
Нет не пофигу. Может процент меньше. Просто на современных пнях гораздо эффективнее использовать SIMD оптимизировать обращения к кэшу и развернуть циклы вообщем ручная оптимизация. Дает до 50 кратного прироста в скорости правда затраты на разработку увеличиваются чуть ли не также.
← →
Дмитрий Белькевич (2010-03-17 00:25) [11]
> в каких годах?
Недели три назад.
← →
Дмитрий Белькевич (2010-03-17 00:31) [12]
> Просто на современных пнях гораздо эффективнее использовать
> SIMD
По алгоритмам я pure pas имел в виду. Если пользовать асм - то да - можно simd. Точнее - только simd и имеет смысл. Обычный асм прироста скорости почти не даст. У меня asm mmx получался в 3 - 3.5 раз быстрее. Из известного - делал фильтры-свёртки на mmx.
← →
MBo © (2010-03-17 07:52) [13]>TStas
показал бы, что ли, пресловутую подпрограмму...
← →
oxffff © (2010-03-17 08:44) [14]
> Как заставить подпрограмму считать быстрее
Купить новый процессор и разогнать.
← →
Anatoly Podgoretsky © (2010-03-17 09:10) [15]> Pavia (16.03.2010 23:35:10) [10]
Было примерно 80% от максимально возможного, стало 4000%
Не хилая оптимизация.
← →
Mystic © (2010-03-17 10:26) [16]Локальная переменная может быть помещена в регистр.
← →
GDI+ (2010-03-17 19:45) [17]
> TStas (16.03.10 21:04)
>
> Есть подпрограмма, которая должна выполнять достаточно интенсивный
> счёт. Правильно ли я понимаю, что поскольку адресация переменных
> в подпрограммах относительная, что и подтверждает просмотр
> ассемблерного кода, написанного Дельфями, если я вместо
> локальных переменных буду использовать глобальные, например,
> локальные переменные модуля (но не класса, ибо они тоже
> относительные, просто от Self отсчитываются), то тогда считать
> должно быстрее, притом намного? Ведь при каждом обращении
> к локальной переменной подпрограммы просисходит вначале
> вычисление её адреса, то есть дополнительное сложение. Это
> всё так?
Если много считать, то простая перекомпиляция алгоритма под 64-бита и использование через COM(exe) даст прирост в скорости в 40% за счёт 8 дополнительных регистров. Ну еще добвить к этому mmx, sse и получаешь прирост в два-три раза.
А забив на все и подрубив CUDA(32-512 параллельных вычислителей с четырьмя АЛУ float/integer) в некоторых случаях и до 10-50 раз.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.081 c