![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Вот оно ДЕТИЩЕ
![]() Код:
|
![]() |
![]() |
![]() |
#2 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Это еще чё. Было вот так
Код:
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 19.11.2010
Сообщений: 7
|
![]()
По хорошему, надо бы ещё EBX в стеке сохранять
|
![]() |
![]() |
![]() |
#4 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]()
Что это за фигня? Почему нет ни одной инструкции XCHG?
В разработке: воспроизводственный контур ИТ
|
![]() |
![]() |
![]() |
#5 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Насколько я понял, если компилятор чтит паскалевские соглашения, то не нужно. EBX не будет после отработки этой подпрограммы использоваться как указатель. На тестах всё было нормально.
Но я могу ошибаться. Я на счет ESI тоже до конца не понял, собственно поэтому и сохраняю его в стек. Обработка предполагалась однопотоковая + вот это: http://www.programmersforum.ru/showthread.php?t=279011 Последний раз редактировалось Sibedir; 09.09.2015 в 12:13. |
![]() |
![]() |
![]() |
#6 |
Регистрация: 19.11.2010
Сообщений: 7
|
![]()
С XCHG значительно медленнее.
Предложу свою модификацию: Код:
2Sibedir Практика показывает, что EBX тоже нужно сохранять. Последний раз редактировалось Dmitro25; 09.09.2015 в 13:51. |
![]() |
![]() |
![]() |
#7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Dmitro25, да, есть и такое. Многое зависит от объема перемещаемой партии, частоты вызовов, выравнивания данных, модели процессора и пр.
Я уже 1000 вариантов перепробовал. От простых типа: Код:
Последний монстр отложен на неопределённый срок в виду того, что основная цель (образовательная) достигнута. |
![]() |
![]() |
![]() |
#8 |
Регистрация: 19.11.2010
Сообщений: 7
|
![]()
Sibedir
Свой вариант тестировал только на Core i3 с выравниванием 4 и размером данных от 57 до 64 байт. Наблюдал устойчивый прирост. А так да, в современных процессорах наличие хитрого конвейера и кэша сделало задачу оптимизации весьма нетривиальной. Вот пример: недавно в библиотеке mORMot наткнулся на процедуру вычисления CRC-32, которая на поверку оказалась в 5 (пять!) раз быстрее, чем моя самопальная процедура на ассемблере. Спасибо, что поделились свои кодом, заодно и меня на небольшое творчество сподвигли. Я тут пишу свою реализацию списка, который будет хранить не указатели на записи, а сами записи (по типу TDIVector из DIContainers, только попроще, но и побыстрее). Понадобилось для процедуры сортировки сделать Exchange области памяти, стал искать, через google нашёл ваше решение. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Почта Exchange | Nemesis9 | Работа с сетью в Delphi | 1 | 18.12.2013 10:54 |
Dynamic Data Exchange | tolikman | Microsoft Office Excel | 2 | 12.08.2011 20:34 |
Странное поведение BASM | Sibedir | Общие вопросы Delphi | 8 | 31.01.2011 12:02 |
Оптимизация sin() на BASM | InternetStranger | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 5 | 11.02.2010 00:56 |