Когда я использовал программу для встроенных систем и ранних 8/16-разрядных компьютеров (6502, 68K, 8086), я очень хорошо разбирался в том, как долго (в наносекундах или микросекундах) каждая инструкция выполнялась. В зависимости от семейства, один (или четыре) циклы, приравненные к одной "выборке памяти", и без кэшей, о которых можно беспокоиться, можно угадать тайминги, основанные на количестве задействованных обращений к памяти.
Но с современными процессорами я смущен. Я знаю, что они намного быстрее, но я также знаю, что скорость гигагерца в заголовке не помогает, не зная, сколько циклов этих часов требуется для каждой инструкции.
Итак, может ли кто-нибудь предоставить некоторые тайминги для двух примерных инструкций, например, (предположим) 2GHz Core 2 Duo. Наилучшие и худшие случаи (не предполагая ничего в кеше/все в кеше) были бы полезны.
Инструкция № 1: Добавить один 32-разрядный регистр на второй.
Инструкция # 2: Переместите 32-битное значение из регистра в память.
Изменить. Причина, по которой я задаю это, - попытаться разработать "правило большого пальца", которое позволит мне взглянуть на простой код и приблизительное измерение времени, затраченного на ближайший порядок величина.
Редактировать # 2: Множество ответов с интересными моментами, но никто (пока) не поставил цифру, измеренную во времени. Я ценю, что есть "осложнения" на вопрос, но c'mon: Если мы сможем оценить количество пианино-тюнеров в Нью-Йорке мы должны быть в состоянии оценить время выполнения кода...
Возьмите следующий (немой) код:
int32 sum = frigged_value();
// start timing
for (int i = 0 ; i < 10000; i++)
{
for (int j = 0 ; j < 10000; j++)
{
sum += (i * j)
}
sum = sum / 1000;
}
// end timing
Как мы можем оценить, сколько времени потребуется для выполнения... 1 фемтосекунды? 1 gigayear?