|
Вопрос # 3 646/ вопрос открыт / |
|
Здравствуйте!
Вот я тут на днях решил проверить насколько быстрее ассемблерные вставки в дельфи их "исстинно дельфовых" аналогов.
И ужаснулся. Дело в том что аналогичные действия будучи сделаны ассемблерными вставками производятся в 3(!) раза медленней! Может это связано с тем что компилятор производит какие-то действия перед вставкой? Смотри примеры.
ps. Почему в первом примере в скорости проигрыш? Почему во втором не такой большой?
зыы. Я думаю что дельфи при компиляции добавляет перед\после (или им то и другое) вставки сохранение\восстановление регистров\стека.
Приложение: Переключить в обычный режим-
- //delphi 900 ms
- for i:=0 to 1000000000 do begin
- x:=x+1;
- end;
- //asm 2300 ms!
- for i:=0 to 1000000000 do asm
- add x, 1
- end;
-
-
- //delphi 2500 ms
- for i:=0 to 1000000000 do begin
- x:=abs(x);
- end;
- //asm 2100 ms (-_-)
- for i:=0 to 1000000000 do asm
- neg x
- end;
-
 |
Вопрос задал: Gooddy (статус: 3-ий класс)
Вопрос отправлен: 12 января 2010, 22:59
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Failure!
Тут все гораздо запутаней. Дело в том, что делая ассемблерные вставки, надо понимать, что делаешь. И это началось где то с Pentium I. Есть такая штука, как спаривание команд. То есть, определенные пары команд процессор может исполнять быстрее, чем если бы он их исполнял по очереди. Например, увеличение двух регистров одновременно на единицу. Компилятор вкурсе о таких последовательностях и активно их использует (это хорошо видно по коду 2007 дефли и старше).
Второе - процессору легче испольнять долгий, но линейный код, чем короткий, но ветвистый. Вот к примеру по этой ссылке можно посмотреть, что может вытворять компилятор.
Также есть ещё много-много вещей, как сброс кеша, ошибка предстказания переходов которые сильно ухудшают производительность.
В целом, на ассемблере тоже надо уметь писать.
Если всё вышесказанное интересно, то добро пожаловать на сайт wasm.ru, а также на сайт интела за документацией по процессорам:) Но я не знаю, понимает ли кто то это всё хорошо...
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 12 января 2010, 23:37
Оценка за ответ: 5
Комментарий к оценке: Спасибо, буду обращаться.
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 12 января 2010, 23:10; участников в обсуждении: 1.
|
Gooddy (статус: 3-ий класс), 12 января 2010, 23:07 [#1]:
попробовал
asm
mov ecx, 1000000000
@for_loop:
neg x
loop @for_loop
end;
Но прибавки нет. Неужели у дельфи настолько оптимальный код? По видимому, пока нет ничего сложного производительность не падает. Но почему при увеличении числа она даже больше чем у ассемблера?
Вобщем в чём дело? Дельфи действительно по скорости близок к ассемблеру или просто ассемблерные вставки плохо реализованы? Или я что-то не так делаю -_-.
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 12 января 2010, 23:10 [#2]:
Даже если сначала заносить x в регистр, затем делать расчёты и выносить из регистра, результат всё равно слабый. 2000 мс.
Чисти код! Чисти код! Чисти код!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|