Всем привет
Хотелось бы поделиться "способами" как ускорить выполнения программ (Без применения asm)
1.Замечено что цикл while выполняется чуть быстрее чем for
2.Умножение при преобразований координат лучше заменить сдвигом
Может кто еще что знает...
PS
Да кстати есть еще один вопрос :
В чем разница если я напишу на asm (например вкл мыши) или воспользуюсь оператором inline
По моему никакой.
вообще InLine абсолютно ненужная вещь...
вставлять машкоды можно и без неё...
немного тупо поставлен сабж...
есть разные оптимизации...высокоуровневая, оптим-ия на ср-ем ур-не и на низком
2PingOfDeath: Применительно к Паскалю или пофигу (оптимизация)??
Единственное что могу сказать по
Я что-то про координаты не понял...
to GLuk
"А если тебе надо вставить кусочек на асме в 20 разных мест, причем АБСОЛЮТНО одинаковый и оформить его не в виде процедуры, а именно куска кода??!! "
скопируй нужное число раз
почему же в Delphi Inline нет?
потому что он попросту не нужен
и повторяясь говорю - машкод можно и без него вставлять
а на счёт оптимизации - у Зубкова написано
сам помнится на него линк давал
Ну вот, чел предложил тему, а ты говняешь ее на корню...
В таком случае на форуме вообще нечего обсуждать, ведь все можно и прочитать ;)
И все-таки ты почему-то пропустил вопрос про оптимизацию СРЕДНЕГО уровня. Я мож Зубкова и не читал, но про такое никогда не слышал??!
INLINE:
А теперь усложним задачу; представь себе код в 2000 байт, который нужно вставить в 2963 места; и ты его будешь КОПИРОВАТЬ?!! Причина твоего неприятия к INLINE кроется, вероятно, в твоих целях и задачах при реализации коих тебе просто была не нужна эта возможность...
2Max: Что ты не понял?? Какие координаты?
Max N. Medentsev:
Операции сдвига можно (иногда) применять при умножении или делении
А про координаты это так к примеру...
___ALex___:
Что же тупого в теме ? Вопрос поставлен четко ...
(Насколько я понимаю название темы должно быть кратким и
всем понятным)
А насчет почитать - всегда рад...
Только где?
GLuk:
Спасибо насчет inline...
All:
Речь идет только о паскале. Т.е. как только средсвами паскала
можно добится максимальной скорости выполнения...
(Какие лучше операторы использовать или заменять
их другими...)
PS
Мож кто знает: оператор port[ ] делает небольшую задержку после отправки данных в порт?
GLuk
насчёт оптим-ии: высокий ур-нь - выбор эфф-ого алг-ма
ср-ий - оптим-ия сущ-его алг-ма(его реализация)
низкий - опт-ии под арх-ру проца
то есть перестановка инс-ий и подобноеа
а насчёт InLine-а я тебя не понял
какая разница что написать
asm
DB 0EAH
DW 10
DW 20
end;
или тоже InLine-ом...
PingOfDeath
а чтобы выяснить есть задержки какие или нет смотри код генер-ый комп0ом и делай выводы - оптимален он или нет
2___Alex___:
Насчет оптимизации; я, вероятно, низковато думал... я тер по поводу оптимизации на уровне ЯЗЫКОВЫХ конструкций! А где ты, кстати, почитал по этому поводу??
Насчет INLINE'a: Фишка в том, что инлайн конструкция ВСТАВЛЯЕТ кусок кода на место вызова. А ежели на асме оформлено в виде процедуры, то соответственно идет задержка на call & ret, типа того. Но если оформлено в теле программы, то ессесно никаких различий.
GLuk
у Зубкова
где бы почитать про арх-ру проца?
везде больно мало и часто непонятно...
кстати есть отличный док по BASM-у в Delphi
надо?
там именно всё по сабжу
берётся пакс-ий код типа
function Min(const A, B: Extended): Extended;
begin
if A < B then Result := A else Result := B
end;
анализ-ся ассем-ый код в который компилится этот паск-ий код и
проводится оптимизация
очень полезное чтиво
заодно и оценишь эффективность компилятора
проблема: многократно (порядка 100 000 раз) выполняется вызов функции, причем неизвестно какой именно, но из числа 10ти заранее известных. На каждом витке цыкла от некоторых условий (достаточно простых) зависит, какую же из них. Использовать выбор if или case - слишком медленно. Как ускорить?
В принципе большой разницы нету, все равно в конечном счете все сведется к cmp ax,bx j...; Выложи сам код.
Есть вариант.
Заводится массив из 10 процедур и обращение к ним идёт по индексу (без сравнений) с последующим его (индексом) изменением.
Но это подходит для редких случаев (напр. для автоматов).
вот еще частенько нужно...
for i:=1 to N do A[i]:=0 // N - размер массива
заменяем на
fillchar(A, sizeof(A), 0)
И короче, и (вроде как) быстрее
про строки:
Скороть работы со строками будет выше, если:
вместо lenght(s) использовать ORD(s[0]);