磁盘IO操作指令和普通表达式指令所消耗的时间对比

以下是一个例子,调用fprintf函数会产生一次磁盘IO操作,如果只调用i++则只是寄存器内表达式的运算。

# disk io VS statements

#include <stdlib.h>
#include <stdio.h>
#include <time.h>


int main(int argc, char* argv[]){
    int i, to, sum = 0;
    FILE *fp = fopen("file", "w");
    to = atoi(argv[1]);
    clock_t start = clock(), diff;
    for(i=1; i<=to; i++){
        sum += sum + i;
        //printf("%d\n", sum);
        fprintf(fp, "%d", sum);
        // i++;
    }
    diff = clock() - start;
    int msec = diff * 1000 / CLOCKS_PER_SEC;
    printf("Time taken %d seconds %d milliseconds\n", msec/1000, msec%1000);
}

结论:磁盘IO操作所需时间约是寄存器内运算所需时间的约100万倍。 具体时间,不同的测试环境和参数有所不同。但已经足以说明问题。 计算机内部不同的位置,存取访问时间相差很大,下表可以说明一些问题。 根据下表,可以对服务问题排查和调优带来相当的指导和启发作用。

Typical access time Position Typical capacity
1 nsec Registers <1KB
2 nsec Cache 4MB
10 nsec Main Memory 512-2048MB
10 msec Magnetic disk 200-1000GB
100 sec Magnetic tape 400-800GB