Главная страница
    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.5 MB
Время: 0.072 c
15-1271140789
TRSteep
2010-04-13 10:39
2010.08.27
Net Framework 3.5 зависает при установке


2-1269763764
Alex_C
2010-03-28 12:09
2010.08.27
Инициализация глобальных переменных


15-1267230629
Юрий
2010-02-27 03:30
2010.08.27
С днем рождения ! 27 февраля 2010 суббота


15-1272463188
Раиса
2010-04-28 17:59
2010.08.27
Биноминальные коэффициенты - не понимаю


15-1264345015
test
2010-01-24 17:56
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский