Я знаю, что xorq %rax,%rax
быстрее, чем movq $0,%rax
, потому что мой компилятор сказал мне. Однако, если я не знаю ответа, что мне делать, чтобы сравнить xorq и movq выступления?Как сравнить скорости команд ASM?
То, что я попытался это:
int main(void)
{
long a;
long i = 0;
for (i = 0; i < 10000000000l; i++) {
a = 10;
__asm__(
#if 0
"movq $0, %%rax"
#else
"xorq %%rax, %%rax"
#endif
: "=a" (a) : "a" (a))
}
return 0;
}
Однако, когда я время программы (один раз с #if 0
, один раз #if 1
), я получаю очень близкие результаты (5.876 ± 0,001 секунды). FYI, я установил регулятор масштабирования на самую низкую частоту, и я проверил пользователя , возвращенный time(1)
.
Я также пробовал с addq %rax,%rax
против imulq $2,%rax
, снова не повезло.
Я знаю, что современные процессоры довольно умны в оптимизации выполнения кода, и я думаю, именно поэтому я не получаю полезные результаты. Поэтому я здесь, чтобы спросить: как мне продолжить? Я на правильном пути?
@MikeDunlavey: aah, вы правы. Я изменил цикл и использовал 16 _movq/xorq_ за каждое вмешательство вместо одного. Теперь я начинаю видеть некоторые различия. См. Http://pastebin.com/QfWjAGvj – user16538
@MikeDunlavey: с _addq_ vs _imulq_, разница составляет почти 10 секунд. Если вы включите свой комментарий в ответ, я приму его как можно скорее. – user16538
Существуют и другие преимущества: вы можете обнулить 64-битный регистр, используя 'xorl% eax,% eax', хотя вы можете сделать это с помощью' movl', но все равно меньше байтов. Шаблон «xor R, R» также является выключателем зависимостей, а на более новых архитектурах не требуется блок исполнения (нулевая латентность). –