为什么缓冲0.030000秒与“更好”缓冲0.030000秒相同?如果4倍大的线条不会改变时间,我怎样才能加快它的速度呢?
测试
$ ./a.out
Unbuffered: 0.770000 seconds
Buffered: 0.030000 seconds
Better buffered: 0.030000 seconds
代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1024 /* read 1024 bytes at a time */
#define betterSIZE 4096 /* read a better size at a time */
int copy() /* input2output ie anything to anything */
{
char buf[betterSIZE];
int n;
while ((n = read(0, buf, betterSIZE)) > 0)
write(1, buf, n);
return 0;
}
int main(int argc, char **argv)
{
/* copy(); */
/* make the names known */
void info(char file_name[]);
void buffered(char file_name[]);
void better_buffered(char file_name[]);
/* test */
clock_t toc;
clock_t tic = clock();
info("coreutils_8.13.orig.tar.gz");
info("coreutils_8.13.orig.tar.gz");
info("coreutils_8.13.orig.tar.gz");
info("coreutils_8.13.orig.tar.gz");
info("coreutils_8.13.orig.tar.gz");
toc = clock();
printf("Unbuffered: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
tic = clock();
buffered("coreutils_8.13.orig.tar.gz");
buffered("coreutils_8.13.orig.tar.gz");
buffered("coreutils_8.13.orig.tar.gz");
buffered("coreutils_8.13.orig.tar.gz");
buffered("coreutils_8.13.orig.tar.gz");
toc = clock();
printf("Buffered: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
tic = clock();
better_buffered("coreutils_8.13.orig.tar.gz");
better_buffered("coreutils_8.13.orig.tar.gz");
better_buffered("coreutils_8.13.orig.tar.gz");
better_buffered("coreutils_8.13.orig.tar.gz");
better_buffered("coreutils_8.13.orig.tar.gz");
toc = clock();
printf("Better buffered: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
return 0;
}
void info(char file_name[])
{
int ch;
FILE *fp;
fp = fopen(file_name,"r");
// read mode
if (fp == NULL)
{
perror(file_name);
exit(EXIT_FAILURE);
}
while ((ch = fgetc(fp)) != EOF)
{
//putchar(ch);
}
fclose(fp);
}
void buffered(char file_name[])
{
char buf[SIZE];
FILE *fp;
size_t nread;
fp = fopen(file_name, "r");
if (fp) {
while ((nread = fread(buf, 1, sizeof buf, fp)) > 0)
{
//fwrite(buf, 1, nread, stdout);
}
if (ferror(fp)) {
/* to do: deal with error */
}
fclose(fp);
}
}
void better_buffered(char file_name[])
{
char buf[betterSIZE];
FILE *fp;
size_t nread;
fp = fopen(file_name, "r");
if (fp) {
while ((nread = fread(buf, 1, sizeof buf, fp)) > 0)
{
//fwrite(buf, 1, nread, stdout);
}
if (ferror(fp)) {
/* to do: deal with error */
}
fclose(fp);
}
}
答案 0 :(得分:4)
fread
已经缓冲数据,即在内部以块大小4K或8K的大小读取它(确切的默认缓冲区大小由实现定义)。因此,将读取从1K切换到4K不会产生任何影响,因为它只会减少memcpy
次操作的次数,这些操作足够便宜而不能在统计噪声基准上注册。
要影响stdio
缓冲区的大小,请查看setbuf
。
此外,您要更改的不是行大小,因为您不是逐行读取文件,而是逐块读取文件大小。
答案 1 :(得分:3)
操作系统无论如何都会从HD读取整个块/ sectors,足以填充page,然后缓存一段时间。
因此,如果您阅读1024或4096并不重要。页面通常为4096。
如果您想加快速度,请尝试一起阅读几页。例如8页。
#define PAGE_SIZE 4096
#define betterSIZE 8*PAGE_SIZE
答案 2 :(得分:1)
stdio库本身实现了一个缓冲区 - 所以这两个函数基本上是相同的,使用与库实现的相同大小的缓冲区。