c - 为什么这不能作为磁盘速度测试?
问题描述
我用C写了一个非常简单的程序来测试程序所在存储设备的读写速度。它可以是 SSD、HDD 或 USB 记忆棒。但是我得到的结果非常不一致,这很奇怪,因为程序非常简单明了。
当我在 USB 3.0 记忆棒上运行它时,它会给出 270 mb/s [写入] 和 2100 mb/s [读取] 之类的值。对于 HDD,它给出了类似的值。对于 SSD,它提供类似的读取速度和大约 300 mb/s 的写入速度。
这很奇怪,因为代码中没有任何复杂的东西,我也没有优化它。报告的速度与这些设备的正常速度不匹配。不过,可能是我并不真正了解它是如何工作的。
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <math.h>
const unsigned int N = 25000000; /// Number of floats to be written
int main(){
double time0, time1, time2;
unsigned int i, size = N*sizeof(float); /// Size of the file to be written/read in bytes
FILE *pfin, *pfout;
float *array_write, *array_read, sum, delta_write, delta_read;
array_write = (float *) malloc(N*sizeof(float)); /// Array to be written to a file
array_read = (float *) malloc(N*sizeof(float)); /// Array to be read
for(i = 0; i < N; i++)
array_write[i] = i*1.f/N; /// Filling in array with some values
time0 = omp_get_wtime();
pfout = fopen("test.dat", "wb");
fwrite(array_write, N*sizeof(float), 1, pfout);
fclose(pfout);
time1 = omp_get_wtime();
pfin = fopen("test.dat", "rb");
fread(array_read, N*sizeof(float), 1, pfin);
fclose(pfin);
time2 = omp_get_wtime();
sum = 0.f;
for(i = 0; i < N; i++)
sum += fabsf(array_read[i] - array_write[i]); /// Simple test to check whether it read properly or not
delta_write = time1 - time0;
delta_read = time2 - time1;
printf("delta1 = %f, delta2 = %f, size = %f Gb, diff = %f\n", delta_write, delta_read, size/1000000000.f, sum);
printf("Speed: \n Write: %f [Mb/s]\n Read: %f [Mb/s]\n", size/1000000.f/delta_write, size/1000000.f/delta_read);
free(array_read);
free(array_write);
}
//// compile with gcc program.c -lgomp -lm -O0 -o program.x
请注意,它会创建一个 100 mb 的文件。
解决方案
推荐阅读
- ruby-on-rails - rspec 控制器测试无法通过调试控制器
- kdb - 通过仅登记一列创建单行表
- flutter - 在 Flutter 应用中从 pubspec for web 获取版本
- javascript - 尝试使用 jQuery 隐藏字段,但在显示原始字段几毫秒后将其隐藏
- reactjs - 如何阻止 useEffect 使我的组件无限重新渲染?
- angularjs - 在angularjs中获取请求标头
- c# - 构建类库时出现ILMerge OutOfMemoryException 错误
- node.js - Mongo DB:更新文档的某些字段以及在一个 FindbyIdandUpdate 中推送参考
- javascript - 不能在 JS 中使用事务语句
- angular8 - 如何设置 [value]="res"