Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 646

Раздел: Ассемблер
/ вопрос открыт /

Здравствуйте!
Вот я тут на днях решил проверить насколько быстрее ассемблерные вставки в дельфи их "исстинно дельфовых" аналогов.
И ужаснулся. Дело в том что аналогичные действия будучи сделаны ассемблерными вставками производятся в 3(!) раза медленней! Может это связано с тем что компилятор производит какие-то действия перед вставкой? Смотри примеры.

ps. Почему в первом примере в скорости проигрыш? Почему во втором не такой большой?
зыы. Я думаю что дельфи при компиляции добавляет перед\после (или им то и другое) вставки сохранение\восстановление регистров\стека.

Приложение:
  1.  
  2. //delphi 900 ms
  3. for i:=0 to 1000000000 do begin
  4. x:=x+1;
  5. end;
  6. //asm 2300 ms!
  7. for i:=0 to 1000000000 do asm
  8. add x, 1
  9. end;
  10.  
  11.  
  12. //delphi 2500 ms
  13. for i:=0 to 1000000000 do begin
  14. x:=abs(x);
  15. end;
  16. //asm 2100 ms (-_-)
  17. for i:=0 to 1000000000 do asm
  18. neg x
  19. end;
  20.  


Gooddy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Gooddy (статус: 3-ий класс), 12 января 2010, 23:07 [#1]:

попробовал
asm
mov ecx, 1000000000
@for_loop:
neg x
loop @for_loop
end;
Но прибавки нет. Неужели у дельфи настолько оптимальный код? По видимому, пока нет ничего сложного производительность не падает. Но почему при увеличении числа она даже больше чем у ассемблера?

Вобщем в чём дело? Дельфи действительно по скорости близок к ассемблеру или просто ассемблерные вставки плохо реализованы? Или я что-то не так делаю -_-.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 12 января 2010, 23:10 [#2]:

Даже если сначала заносить x в регистр, затем делать расчёты и выносить из регистра, результат всё равно слабый. 2000 мс.
Чисти код! Чисти код! Чисти код!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:46
Выполнено за 0.04 сек.