Приветствую. Скажите, почему нижеприведенный код на разных машинах дает разный результат (разница в 3-4 раза): Code (Text): _asm{ rdtsc xchg ecx,eax rdtsc sub eax,ecx mov lval,eax } На десктопе (Pentium E8500 Core 2 Duo 3.17 Ггц 2 Гб ОЗУ) этот код дает 28 тактов. А на ноутбуке (Core 2 Duo T7500 2,2 ГГц 1 Гб ОЗУ) - 130. Разве количество тактов зависит от мощности процессора? Неужели на ноуте большое количество переключений планировщика на другие процессы и в связи с этим считаются "ненужные" мне такты?
Разная скорость работы памяти, разное содержимое кэша и TLB... В общем, измерять время выполнения одной отдельно взятой инструкции на современных процессорах попросту бессмысленно: слишком много посторонних факторов на это влияет. Да и исполняются простые команды по нескольку штук за такт (а сколько -- зависит от самих инструкций, их порядка, используемых в них операндов)...
Измерять время выполнения одной инструкции не имеет смысла, ибо счётчик числа тактов обновляется реже, чем раз в такт. Поэтому измеряют всегда время выполнения куска кода, и желательно, чтобы этот кусок кода был побольше. Кроме того, нужно сериализовать конвеер до и после выполнения кода с помощью инструкции cpuid. Как это делать правильно смотри, например, в коде Агнера Фога (www.agner.org/optimize/). Если тебе просто нужно время выполнения инструкции, могу посоветовать несколько документов, где их можно взять: http://instlatx64.freeweb.hu - реально замеренные Everest'ом latency и throughput инструкций и некоторые параметры кэша http://www.agner.org/optimize/ - уже упомянутый сайт Агнера Фога, где есть не только latency и throughput инструкций, но и кое-какие сведения о микрооперациях, из которых они состоят Optimization Manuals от Intel и AMD. В приложениях к этим мануалам есть latency, throughput и execution unit наиболее распространённых инструкций