2014-02-03 9 views
1

Какая операция занимает больше CPU часов, modulo или comparison?Эта операция требует больше часов процессора, по модулю или сравнению?

Будет ли этот код займет больше времени:

for(j = i; j <= 10; j++) 
{ 
    if(j == 10) printf("0"); 
    else printf("%d", j); 
} 

или это

for(j = i; j <= 10; j++)  
    printf("%d", j % 10); 

и почему?

+1

Если вы хотите сравнить ассемблерные коды, вы можете разобрать исполняемый файл (или использовать 'gcc -S') и проверить код, также использовать флаги оптимизации –

+0

Практически то же самое, потому что printf() будет потреблять 99% времени. Если вы его очистите, ответ @Javier верен. – Gangnus

ответ

9

Если измерено в цикле ЦП, возможно, операция по модулю занимает больше циклов; это может зависеть от процессора. Однако циклы CPU не являются отличным способом измерения производительности с помощью современных процессоров, которые запускают сразу несколько команд (конвейерная обработка), имеют несколько уровней кеша и т. Д. В этом случае добавление дополнительного теста будет означать дополнительную ветвь, которые могут быть более значительными с точки зрения времени (т. е. влияют на конвейер команд). Единственный способ узнать наверняка - это оптимизировать его и время.

Я знаю, что ваш пример предназначен именно для этого примера, но это также иллюстрирует преждевременную оптимизацию. Призыв к printf займет порядка больше времени, чем по модулю или сравнению. Если вы хотите, чтобы оптимизировать свой пример, можно было бы написать что-то вроде:

printf ("1234567890"); 
1

Сравнение является простой операцией и, как правило, быстрее (процессор может использовать логические операторы на битах).

Если вы выполняете по модулю номер, который не является мощностью двух, то ЦПУ должен выполнять деление, которое может быть довольно дорогостоящей операцией (конечно, это зависит от размера используемых вами чисел) ,

Говоря о Cpu часов, сравнение может быть сделано параллельно, так как вы можете просто использовать xor операции, тот самый x==10 или x==200000 будет принимать то же небольшое количество центрального процессора часов. С разделением это невозможно, и для большего числа потребуется больше времени.

+1

На многих процессорах сравнения записывают свои результаты в глобальный регистр, что предотвращает их выполнение параллельно с другими инструкциями с использованием этого регистра. Некоторые процессоры занимаются разделом, который регистрирует или предоставляет для него «переименование», что допускает некоторый параллелизм. Однако даже при этом для метода сравнения требуется ветвь, и ветви не только не могут быть распараллелены, но и предзачитываются прерывания и спекулятивное выполнение. –

1

С точки зрения Ассамблеи, операция по модулю означает «никогда так легко» умножение. См. Некоторые algorithms. Операция ветвления на самом деле является второй самой быстрой инструкцией (прыжок является первой), поскольку для сравнения требуется всего одна субтракция.

+0

и деление тоже :-) – Gangnus

 Смежные вопросы

  • Нет связанных вопросов^_^