我尝试检查哪种更快:
我的结果说没有区别。你觉得呢?
我的下面的代码:
开始:
size_t start = clock();
volatile size_t some = 0;
FILE* fh = fopen("/home/xxx/test/file.txt", "r");
size_t size = 0;
fseek(fh, 0L, SEEK_END);
size = ftell(fh);
rewind(fh);
char* result = (char*) malloc(sizeof(char) * (size + 1));
fread((void*) result, sizeof(char), size, fh);
result[size] = '\0';
for (size_t i = 0; i < size; i++)
{
if (result[i] % 2)
{
some++;
}
}
free(result);
int c = fgetc(fh);
while (c != EOF)
{
if (c % 2)
{
some++;
}
c = fgetc(fh);
}
结束:
fclose(fh);
size_t end = clock();
printf("TIME = %zu\n", end - start);
在我的情况下,操作很简单,易失性会阻止编译器优化。
答案 0 :(得分:1)
可能是文件的读取限制了性能,与读取文件相比,您对数据进行的操作成本可忽略不计。为了提高效率,最好以足够大的块为单位进行处理,因此原则上一次仅一个字节可能是不好的。
但是,在实践中,可能在后台进行了一些巧妙的缓冲。因此,即使您的程序一次只请求一个字节,实际上该文件也需要大块读取,从而为您提供与第一种方法大致相同的性能。
(上面的假设是文件的读取完全控制了成本。如果不是这种情况,并且如果内存访问速度很慢,则可能发生一次一字节的方法是更快,因为这种方法避免了两次访问同一部分内存。)