Когда я использовал для программирования встроенных систем и более ранних 8/16-битных ПК (6502, 68K, 8086), у меня было довольно хорошее представление о том, как долго (в наносекундах или микросекундах) выполнялась каждая инструкция. В зависимости от семейства один (или четыре) цикла приравниваются к одному «извлечению памяти», и без кэшей, о которых следует беспокоиться, можно угадать время, основываясь на количестве обращений к памяти.
Но с современными процессорами я запутался. Я знаю, что они намного быстрее, но я также знаю, что скорость заголовка в гигагерцах бесполезна, если не знать, сколько циклов этих часов необходимо для каждой инструкции.
Итак, кто-нибудь может предоставить некоторые временные параметры для двух примеров инструкций, скажем, на 2 ГГц Core 2 Duo. Лучшие и худшие случаи (при условии, что в кеше ничего нет / все в кеше) были бы полезны.
Инструкция # 1: Добавить один 32-битный регистр в секунду.
Инструкция # 2: Переместить 32-разрядное значение из регистра в память.
Редактировать : Причина, по которой я спрашиваю об этом, состоит в том, чтобы попытаться разработать «практическое правило», которое позволило бы мне взглянуть на простой код и приблизительно измерить время, затраченное на ближайший порядок величины ,
Редактировать # 2: Множество ответов с интересными моментами, но никто (пока) не записал цифру, измеренную во времени. Я понимаю, что в этом вопросе есть «осложнения», но давайте: если мы сможем оценить количество настройщиков пианино в Нью-Йорке , мы сможем оценить время выполнения кода ...
Возьмите следующий (немой) код:
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 гиг?