Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2009, 03:51   #1
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
Лампочка Время выполнения

Заинтересовался недавно оптимизацией программ под конкретный процессор. Просто интересно сможет ли кто-нибудь ,не сильно тревожа гугл (yandex,rambler,yahoo,aport,msn,eni gma etc) сказать, почему первый кусок кода выполняется на большинстве процессоров (не на всех) более чем в 2 раза быстрее, чем второй.
Код:
1.
   mov ecx,1000 
@@: 
   sbb eax,ecx 
   sbb edx,ecx 
   sub ecx,1
   jnz @B
Код:
2.
   mov ecx,1000 
@@: 
   sbb eax,ecx 
   sbb edx,ecx 
   dec ecx
   jnz @B
Программу, которой я мерил кол-во тактов я прикрепил.
Вложения
Тип файла: rar wintest.rar (2.5 Кб, 115 просмотров)
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 20.06.2009 в 05:46.
Goodwin98 вне форума Ответить с цитированием
Старый 20.06.2009, 11:31   #2
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Меня самого терзает этот вопрос! А мне кажется 2 участок кода будет работать быстрее, т.к. команда sub работает медленнее, чем dec(ИМХО)
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 20.06.2009, 11:52   #3
DEADHUNT
Пользователь
 
Регистрация: 23.10.2008
Сообщений: 48
По умолчанию

команда dec reg32 есть в двух вариантах: 1-байтовый(в long mode это уже REX prefix) и 2-байтовый
DEADHUNT вне форума Ответить с цитированием
Старый 20.06.2009, 12:11   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Это не sub выполняется быстрее. Просто она сбрасывает флаг переноса и следующая (начало цикла) команда sbb выполняется быстрее. Замените первую команду на sub и время будет почти одинаковым.

Код:
var T1, T2:Cardinal;
begin
   asm
      RDTSC
      mov T1, eax
      xor edx, edx

      mov ecx,1000
   @@B:
      sub eax,ecx     // <--
      sbb edx,ecx
      dec ecx
      //sub ecx, 1
      jnz @@B

      RDTSC
      mov T2, eax
   end;
   writeln(T2-T1:6);
   readln;
end.
alexBlack вне форума Ответить с цитированием
Старый 20.06.2009, 12:39   #5
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
время будет почти одинаковым
А как определить это время?
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 20.06.2009, 12:44   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от MalCer Посмотреть сообщение
А как определить это время?
В смысле ? Разве из кода непонятно ? Если Вы о единицах измерения, то они нас не интересуют. В данном случае важно отношение.
alexBlack вне форума Ответить с цитированием
Старый 20.06.2009, 12:55   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Не не не! Как это значит: из кода понятно? А мне, например, не понятно! Приведу пример: применение оператора dec значительнее быстрее в скорости работы программы, по сранению с loop. Мне интересно как это определили? Ну не на глаз же !
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 20.06.2009, 13:10   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Вот для этого и пишется тест:

Код:
      RDTSC            // Помещает в EDX:EAX значение внутреннего счетчика процессора
      mov T1, eax    // Запомнили младшую часть (старшая вряд ли изменится)

      dec ecx          // тестовая команда

      RDTSC            // новое значение счтечика
      mov T2, eax

      writeln(T2-T1:6);  // Выводим разницу в значениях
Запоминаем полученное значение. Затем заменяем тестовую команду на другую, с которой хотим сравнить (в нашем случае sub ecx, 1) и получаем новое значение. Делаем выводы.

А т.к. время выполнения малО, вместо выполнения одной команды делаем цикл. Важно чтобы в обеих случаях остальные части цикла не влияли на время выполнения (в чем и была проблема).

Последний раз редактировалось alexBlack; 20.06.2009 в 13:13.
alexBlack вне форума Ответить с цитированием
Старый 20.06.2009, 13:14   #9
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Во! Теперь всё понял
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 20.06.2009, 13:58   #10
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Ладно раскусили А если немного поменяем 2 вариант (для тех у кого P IV ,c ядром Northwood)...

Код:
   mov ecx,1000 
@@: 
   sbb eax,ecx 
   cmp ecx,1
   sbb edx,ecx 
   dec ecx
   jnz @B
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 20.06.2009 в 14:16.
Goodwin98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Время выполнения макроса... nikolai_P Microsoft Office Excel 9 03.04.2013 00:59
Посчитать время выполнения процедуры SeЯgey Помощь студентам 1 24.05.2009 18:38
определить время выполнения процедуры? Bezdar Microsoft Office Excel 4 20.01.2009 13:57
Цикл, время выполнения шага KiDoki Общие вопросы Delphi 9 19.12.2008 22:37
Как замерить время выполнения программы Gracel Общие вопросы Delphi 5 12.06.2007 22:16