C 为什么不同的测试有完全相同的数字?
为什么缓冲0.030000秒与“更好”缓冲0.030000秒相同?如果4倍大的线路尺寸不会改变时间,我怎样才能加快速度呢 试验 代码C 为什么不同的测试有完全相同的数字?,c,performance,testing,buffer,microbenchmark,C,Performance,Testing,Buffer,Microbenchmark,为什么缓冲0.030000秒与“更好”缓冲0.030000秒相同?如果4倍大的线路尺寸不会改变时间,我怎样才能加快速度呢 试验 代码 #包括 #包括 #包括 #定义大小1024/*一次读取1024字节*/ #定义betterSIZE 4096/*一次读取一个更好的大小*/ int copy()/*input2outie anything to anything*/ { char-buf[betterSIZE]; int n; 而((n=read(0,buf,betterSIZE))>0) 写入(
#包括
#包括
#包括
#定义大小1024/*一次读取1024字节*/
#定义betterSIZE 4096/*一次读取一个更好的大小*/
int copy()/*input2outie anything to anything*/
{
char-buf[betterSIZE];
int n;
而((n=read(0,buf,betterSIZE))>0)
写入(1,buf,n);
返回0;
}
int main(int argc,字符**argv)
{
/*复制()*/
/*公布姓名*/
无效信息(字符文件名[]);
无效缓冲(字符文件名[]);
作废更好的缓冲(字符文件名[]);
/*试验*/
时钟toc;
时钟=时钟();
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
信息(“coreutils_8.13.orig.tar.gz”);
toc=时钟();
printf(“无缓冲:%f秒\n”,(双精度)(toc-tic)/时钟每秒);
tic=时钟();
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
缓冲(“coreutils_8.13.orig.tar.gz”);
toc=时钟();
printf(“缓冲:%f秒\n”,(双精度)(toc-tic)/每秒时钟数);
tic=时钟();
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
更好的缓冲(“coreutils_8.13.orig.tar.gz”);
toc=时钟();
printf(“更好的缓冲:%f秒\n”,(双精度)(toc-tic)/每秒时钟数);
返回0;
}
无效信息(字符文件名[])
{
int-ch;
文件*fp;
fp=fopen(文件名,“r”);
//读取模式
如果(fp==NULL)
{
perror(文件名);
退出(退出失败);
}
而((ch=fgetc(fp))!=EOF)
{
//putchar(ch);
}
fclose(fp);
}
无效缓冲(字符文件名[])
{
字符buf[大小];
文件*fp;
尺寸(单位:nread);
fp=fopen(文件名,“r”);
if(fp){
而((nread=fread(buf,1,sizeof buf,fp))>0)
{
//fwrite(buf,1,nread,stdout);
}
if(费罗(fp)){
/*要做的事情:处理错误*/
}
fclose(fp);
}
}
void缓冲区更好(char文件名[])
{
char-buf[betterSIZE];
文件*fp;
尺寸(单位:nread);
fp=fopen(文件名,“r”);
if(fp){
而((nread=fread(buf,1,sizeof buf,fp))>0)
{
//fwrite(buf,1,nread,stdout);
}
if(费罗(fp)){
/*要做的事情:处理错误*/
}
fclose(fp);
}
}
fread
已经对数据进行了缓冲,即在内部以块的形式读取数据,通常大小为4K或8K(确切的默认缓冲区大小由实现定义)。因此,将读取从1K切换到4K没有任何作用,因为它只会减少memcpy
操作的数量,这些操作非常便宜,不需要在上述统计噪声的基准中注册
要影响stdio
缓冲区的大小,请查看
此外,您正在更改的不是行大小,因为您不是逐行读取文件,而是块大小。无论如何,操作系统都会从HD读取整个块,足以填充a,然后将其缓存一段时间。
所以读1024或4096并不重要。一页通常是4096页 如果你想加快阅读速度,试着一起读几页。例如8页
#define PAGE_SIZE 4096
#define betterSIZE 8*PAGE_SIZE
stdio库本身实现了一个缓冲区,因此这两个函数本质上是相同的,它们使用库实现的相同大小的缓冲区
#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);
}
}
#define PAGE_SIZE 4096
#define betterSIZE 8*PAGE_SIZE