Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t理解C和C+中缓冲区大小的不同实验结果+;。是否流速度也比文件慢?_C++_C_Memory_Buffer_Ifstream - Fatal编程技术网

C++ Can';t理解C和C+中缓冲区大小的不同实验结果+;。是否流速度也比文件慢?

C++ Can';t理解C和C+中缓冲区大小的不同实验结果+;。是否流速度也比文件慢?,c++,c,memory,buffer,ifstream,C++,C,Memory,Buffer,Ifstream,这一切都是从这个问题开始的-> 为了最大限度地减少磁盘I/O操作,我进行了一些实验,看看缓冲区的大小是否对程序所花费的时间有任何影响 我使用了下面两个代码,一个是C面向的,另一个是C++(虽然两个都是用GCC编译的):-< /P> 面向c的代码:- int buffer_size=1024; FILE *file; file = fopen(argv[1], "r"); FILE *out_file; out_file = fopen("in", "w"); char out_buffer[20

这一切都是从这个问题开始的->

为了最大限度地减少磁盘I/O操作,我进行了一些实验,看看缓冲区的大小是否对程序所花费的时间有任何影响

我使用了下面两个代码,一个是C面向的,另一个是C++(虽然两个都是用GCC编译的):-< /P> 面向c的代码:-

int buffer_size=1024;
FILE *file;
file = fopen(argv[1], "r");
FILE *out_file;
out_file = fopen("in", "w");
char out_buffer[2048];
setvbuf(out_file, out_buffer, _IOFBF, buffer_size);
char buffer[2048];
setvbuf(file, buffer, _IOFBF, buffer_size);
while (!feof(file)) 
{
 char sl[1000];
 fgets(sl, 140 , file);
 fputs(sl, out_file);

}
int buffer_size=1024;
ifstream in_file(argv[1]);
char in_buffer[buffer_size];
in_file.rdbuf()->pubsetbuf(in_buffer,sizeof(in_buffer));
ofstream out_file("in");
char out_buffer[buffer_size];
out_file.rdbuf()->pubsetbuf(out_buffer,sizeof(in_buffer));
while(!in_file.eof())
{
    char sl[1024];
    in_file >> sl;
    out_file << sl<<endl;
}
c代码给出了以下结果(对于14MB的文件):-

(对于103 mb的文件)

在缓冲区大小约为5MB时,它似乎达到饱和点。有什么特别的原因吗

C++面向代码:-< /P>

int buffer_size=1024;
FILE *file;
file = fopen(argv[1], "r");
FILE *out_file;
out_file = fopen("in", "w");
char out_buffer[2048];
setvbuf(out_file, out_buffer, _IOFBF, buffer_size);
char buffer[2048];
setvbuf(file, buffer, _IOFBF, buffer_size);
while (!feof(file)) 
{
 char sl[1000];
 fgets(sl, 140 , file);
 fputs(sl, out_file);

}
int buffer_size=1024;
ifstream in_file(argv[1]);
char in_buffer[buffer_size];
in_file.rdbuf()->pubsetbuf(in_buffer,sizeof(in_buffer));
ofstream out_file("in");
char out_buffer[buffer_size];
out_file.rdbuf()->pubsetbuf(out_buffer,sizeof(in_buffer));
while(!in_file.eof())
{
    char sl[1024];
    in_file >> sl;
    out_file << sl<<endl;
}
C++似乎根本不关心缓冲区大小。为什么?

此外,C++代码的速度慢了15倍(当C中的缓冲区大小为1 MB)时!


ifstream是否通常比FILE慢(其他答案似乎表明没有区别)?或者代码中是否有其他原因导致速度缓慢?

iostreams中的格式化输入>>被认为是非常缓慢的。但问题是,您不能将苹果与苹果进行比较,因为istream>>std::string或char*读取的是一个由空格分隔的单词,而不是fgets所读取的单词。因此,对std::string使用std::getline,或对char*使用istream::getline()来实现类似的功能,这样比较会更有意义


在打开文件之前调用此pubsetbuf()上的PS。这可能是您在文件打开后调用pubstebuf()时未观察到代码读取速度变化的原因。

已知iostreams中的格式化输入>>非常缓慢。但问题是,您不能将苹果与苹果进行比较,因为istream>>std::string或char*读取的是一个由空格分隔的单词,而不是fgets所读取的单词。因此,对std::string使用std::getline,或对char*使用istream::getline()来实现类似的功能,这样比较会更有意义


在打开文件之前调用此pubsetbuf()上的PS。这可能是您在打开文件后调用pubstebuf()时未观察到代码中读取速度发生任何变化的原因。

基本上,编写所花费的时间由以下公式估算:

T = C1*nsyscalls + C2*nbytes

实际上,
C1
是一个非常大的常量(每个系统调用的成本),而
C2
是一个非常小的常量(每个字节的成本)。缓冲区的大小影响比率的大小
nsyscalls/nbytes
;缓冲区越大,它越小。缓冲的目标是使
nsyscalls
相对于
nbytes
足够小,第二项支配第一项,剩下
T=(C2+epsilon)*nbytes
。一旦缓冲区足够大以至于第二项占主导地位,进一步增加缓冲区大小将不会获得任何显著的性能提升。

基本上,编写所花费的时间由以下公式估算:

T = C1*nsyscalls + C2*nbytes

实际上,
C1
是一个非常大的常量(每个系统调用的成本),而
C2
是一个非常小的常量(每个字节的成本)。缓冲区的大小影响比率的大小
nsyscalls/nbytes
;缓冲区越大,它越小。缓冲的目标是使
nsyscalls
相对于
nbytes
足够小,第二项支配第一项,剩下
T=(C2+epsilon)*nbytes
。一旦缓冲区足够大,第二个术语就占主导地位,增加缓冲区大小将不会获得任何显著的性能提升。

< P>你的C++代码的问题在于,没有办法在SurfBuf中设置缓冲区大小。调用
pubstebuf(0,0)
将使输出文件流无缓冲,但使用任何其他值都不会做任何特别的事情。根据规范:

基本流buf*setbuf(字符类型*s,流大小n)

效果:如果在流上发生任何I/O之前对该流调用了setbuf(0,0),则流 变得无缓冲。否则,结果将由实现定义。“无缓冲”是指 pbase()和pptr()始终返回null,文件的输出应尽快显示


看起来,在您的例子中,实现忽略了SETBUF…

< P>您的C++代码的问题在于,没有办法在StudiBuf中设置缓冲区大小。调用
pubstebuf(0,0)
将使输出文件流无缓冲,但使用任何其他值都不会做任何特别的事情。根据规范:

基本流buf*setbuf(字符类型*s,流大小n)

效果:如果在流上发生任何I/O之前对该流调用了setbuf(0,0),则流 变得无缓冲。否则,结果将由实现定义。“无缓冲”是指 pbase()和pptr()始终返回null,文件的输出应尽快显示


在您的情况下,实现似乎忽略了setbuf…

请先尝试设置为false。您肯定不是第一个:,还有更多…@JesseGood。。。这似乎没有什么区别。事实上,如果可能的话,我认为这会让它慢一点。@Mystcial是的,我浏览了第一个线程,他们说这不会有什么区别。我建议使用pwrite和pread将文件IOTry设置为false first。你肯定不是第一个:,还有更多…@jesegood。。。这似乎没有什么区别。事实上,如果可能的话,我认为这会让它慢一点。@Mystcial是的,我浏览了第一个线程,他们说这不应该有什么区别。我建议使用pwrite和pread作为文件,以获得响应。但是使用“in_file.getline(sl,1000);”似乎对时间影响不大。它确实把时间从6.5秒缩短到了5.5秒。谢谢你的回复。但是使用“in_file.getline(sl,1000);”似乎对时间影响不大。它确实把时间从6.5秒降到了5.5秒