编程之美1.1让CPU占用率曲线听你指挥之解法一细节

在解法一中有这么一段话:

对于一个空循环for(i = 0; i < n; i++);该如何来估算这个最合适的n值,来实现我们需要的延时呢?我们都知道CPU执行的是机器指令,而最接近于机器指令的语言是汇编语言,所以我们可以先把这个空循环简单地写成如下汇编代码后再进行分析:
loop:
mov dx i      ;将i置入dx寄存器
inc dx         ;将dx寄存器加1
mov i dx      ;将dx中的值赋回i
cmp i n       ;比较i和n
jl loop        ;i小于n时则重复循环
假设这段代码要运行的CPU是P4 2.4Ghz(2.4 * 10的9次方个时钟周期每秒)。现代CPU每个时钟周期可以执行两条以上的代码,那么我们就取平均值两条,于是让(2 400 000 000 * 2)/5=960 000 000(循环/秒),也就是说CPU 1秒钟可以运行这个空循环960 000 000次。
那么,公式中为什么要除以5?

其实仔细看书中的话,就会容易理解了

书中说了,使用汇编语言来衡量机器指令个数是最合适的,也就是说我们写的一句for 空循环,需要以上五条汇编语言来支持,即一条空的for循环需要执行五条机器指令(可以这样理解,真实环境下并不一定是这样的),所以要除以5,使其变成空的for循环的数目。

实验验证:

本机cpu主频 2.8GHZ

C++ code:

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    while(true){
        for(int i=0;i<1120000000;i++);
    Sleep(10);
    }
    getchar();
    return 0;
}
得到的结果如下:


你可能感兴趣的:(编程之美)