Помощь - Поиск - Пользователи - Календарь
Полная версия: Скорость выполнения программ
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
PingOfDeath
Всем привет
Хотелось бы поделиться "способами" как ускорить выполнения программ (Без применения asm)

1.Замечено что цикл while выполняется чуть быстрее чем for
2.Умножение при преобразований координат лучше заменить сдвигом

Может кто еще что знает...

PS

Да кстати есть еще один вопрос :
В чем разница если я напишу на asm (например вкл мыши) или воспользуюсь оператором inline
По моему никакой.
___ALex___
вообще InLine абсолютно ненужная вещь...
вставлять машкоды можно и без неё...
немного тупо поставлен сабж...
есть разные оптимизации...высокоуровневая,  оптим-ия на ср-ем ур-не и на низком
GLuk
2PingOfDeath: Применительно к Паскалю или пофигу (оптимизация)??
Единственное что могу сказать по
Цитата
Да кстати есть еще один вопрос :
В чем разница если я напишу на asm (например вкл мыши) или воспользуюсь оператором inline
По моему никакой.
:
Оператор INLINE просто вставляет кусок описанного кода на место его упоминания, а вот асм, если оформлено в виде процедуры вызывает эту процедуру, как следствие неб. задержка на call & ret.

2___Alex___: Наверное программисты фирмы Borland полные придурки??!! А если тебе надо вставить кусочек на асме в 20 разных мест, причем АБСОЛЮТНО одинаковый и оформить его не в виде процедуры, а именно куска кода??!!
И насчет тупо поставленного сабжа - это хрень!
Сабж поставлен конкретно: оптимизация языковых конструкций высокого уровня.
А что еще за СРЕДНИЙ уровень????????

типа того...
Maxim
Я что-то про координаты не понял...
___ALex___
to GLuk
"А если тебе надо вставить кусочек на асме в 20 разных мест, причем АБСОЛЮТНО одинаковый и оформить его не в виде процедуры, а именно куска кода??!! "
скопируй нужное число раз
почему же в Delphi Inline нет?
потому что он попросту не нужен
и повторяясь говорю - машкод можно и без него вставлять
а на счёт оптимизации - у Зубкова написано
сам помнится на него линк давал smile.gif
GLuk
Ну вот, чел предложил тему, а ты говняешь ее на корню...
В таком случае на форуме вообще нечего обсуждать, ведь все можно и прочитать  ;)
И все-таки ты почему-то пропустил вопрос про оптимизацию СРЕДНЕГО уровня. Я мож Зубкова и не читал, но про такое никогда не слышал??!
INLINE:
А теперь усложним задачу; представь себе код в 2000 байт, который нужно вставить в 2963 места; и ты его будешь КОПИРОВАТЬ?!! Причина твоего неприятия к INLINE кроется, вероятно, в твоих целях и задачах при реализации коих тебе просто была не нужна эта возможность...

2Max: Что ты не понял?? Какие координаты?
PingOfDeath
Max N. Medentsev:
Операции сдвига можно (иногда) применять при умножении или делении
А про координаты это так к примеру...

___ALex___:
Что же тупого в теме ? Вопрос поставлен четко ...
(Насколько я понимаю название темы должно быть кратким  и
всем понятным)
А насчет почитать - всегда рад...
Только где?

GLuk:
Спасибо насчет inline...

All:
Речь идет только о паскале. Т.е. как только средсвами паскала
можно добится максимальной скорости выполнения...
(Какие лучше операторы использовать или заменять
их другими...)

PS
Мож кто знает: оператор port[ ] делает небольшую задержку после отправки данных в порт?
___ALex___
GLuk
насчёт оптим-ии: высокий ур-нь - выбор эфф-ого алг-ма
ср-ий - оптим-ия сущ-его алг-ма(его реализация)
низкий - опт-ии под арх-ру проца
то есть перестановка инс-ий и подобноеа
а насчёт InLine-а я тебя не понял
какая разница что написать
asm
DB  0EAH
DW 10
DW 20
end;
или тоже InLine-ом...

PingOfDeath
а чтобы выяснить есть задержки какие или нет смотри код генер-ый комп0ом и делай выводы - оптимален он или нет
GLuk
2___Alex___:
Насчет оптимизации; я, вероятно, низковато думал... я тер по поводу оптимизации на уровне ЯЗЫКОВЫХ конструкций! А где ты, кстати, почитал по этому поводу??
Насчет INLINE'a: Фишка в том, что инлайн конструкция ВСТАВЛЯЕТ кусок кода на место вызова. А ежели на асме оформлено в виде процедуры, то соответственно идет задержка на call & ret, типа того. Но если оформлено в теле программы, то ессесно никаких различий.
___ALex___
GLuk
у Зубкова
где бы почитать про арх-ру проца?
везде больно мало и часто непонятно...
кстати есть отличный док по BASM-у в Delphi
надо?
___ALex___
там именно всё по сабжу
берётся пакс-ий код типа
function Min(const A, B: Extended): Extended;
begin
if A < B then Result := A else Result := B
end;
анализ-ся ассем-ый код в который компилится этот паск-ий код и
проводится оптимизация
очень полезное чтиво
заодно и оценишь эффективность компилятора
bulatdi
проблема: многократно (порядка 100 000 раз) выполняется вызов функции, причем неизвестно какой именно, но из числа 10ти заранее известных. На каждом витке цыкла от некоторых условий (достаточно простых) зависит, какую же из них. Использовать выбор if или case - слишком медленно. Как ускорить?
GLuk
В принципе большой разницы нету, все равно в конечном счете все сведется к cmp ax,bx j...; Выложи сам код.
zx1024
Есть вариант.
Заводится массив из 10 процедур и обращение к ним идёт по индексу (без сравнений) с последующим его (индексом) изменением.
Но это подходит для редких случаев (напр. для автоматов).
trminator
вот еще частенько нужно...
for i:=1 to N do A[i]:=0 // N - размер массива
заменяем на
fillchar(A, sizeof(A), 0)
И короче, и (вроде как) быстрее
Altair
про строки:
Скороть работы со строками будет выше, если:
вместо lenght(s) использовать ORD(s[0]);
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.