以下是一个例子,调用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 |