2013-04-14 3 views
1

У меня возникли проблемы с пониманием следующих концепций того, как скорость процессора влияет на продолжительность определенного цикла.Запуск цикла

Для компьютера с процессором 3GHz и может выполнять 64-разрядную арифметику за цикл, как долго будет выполняться следующий цикл?

long long int x; для (x = 0 x < = 0; x -) {}

+0

Надеюсь, это можно было бы оптимизировать. –

ответ

0

Компилятор может оптимизировать этот цикл полностью, поскольку он может обнаружить, что никакой результат никогда не используется.

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

Итак, если мы предположим два цикла, то для этого цикла потребуется около столетия.

irb> 2**63/(3*10**9)/60/60/24/7/52 # => 97 years 

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

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

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