Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.065 c
2-1271606644
tippa
2010-04-18 20:04
2010.08.27
сравнение числа с маской


15-1275009183
wl
2010-05-28 05:13
2010.08.27
Путешествие из Петербурга в Москву (точнее наоборот)


15-1265621167
12
2010-02-08 12:26
2010.08.27
Кто прав? "особенность работы" и стоимость ее исправления


15-1264800605
Юрий
2010-01-30 00:30
2010.08.27
С днем рождения ! 30 января 2010 суббота


15-1264587985
Oleg
2010-01-27 13:26
2010.08.27
Может кто подскажет...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский