设置适当的大小以供rapidjson读取缓冲区

4

我一直在我的c++项目中使用rapidjson,已经知道如何满足项目需求使用它。但是在整理我的代码时,我发现为缓冲区分配了一个随机数。

char readBuffer[80000]; rapidjson::FileReadStream readStream( file, readBuffer, sizeof( readBuffer ) );

有没有正确的方法来设置readBuffer需要多大呢?


向量始终是最好的选择,它可以轻松动态地设置为数据大小。 - Ali Kazmi
由于您正在使用 char readBuffer[80000];,它将被转换为 vector,即 vector<char> readbuffer;(大小为零,稍后可以更改)。 - Ali Kazmi
好的,我明白你在做什么。但是问题在于,'FileReadStream' 期望第二个参数为 char *,而它无法将 vector<> 转换为 char *。还有其他建议吗? - user3339357
2
我查看了其他项目如何使用FileReadStream,它们都使用char buf [65536]。那只是一个魔数吗?还是我漏掉了什么? - user3339357
由于数组大小为int,而int的最大范围是65536。这就是魔法:D - Ali Kazmi
显示剩余2条评论
1个回答

0

FileReadStream 会在每次内部迭代中将一块字节读入用户提供的缓冲区。通过使用这种流的概念,它不需要将整个 JSON 文件读入内存。

缓冲区大小可能会影响性能,但不会影响正确性。

“最佳”缓冲区大小取决于平台和应用程序。

如果大小太小,由于增加了 fread() 调用的数量,会产生更多的开销。

通常用户可以使用程序堆栈(如您的示例)来作为此缓冲区,因此它也不能太大,因为堆栈大小是有限的。在某些嵌入式系统或使用大量线程的应用程序中,使用大型堆栈缓冲区可能会成为更大的问题。

总会有一些参数会影响性能。如果您的应用程序确实需要最佳性能,我认为最好的方法是进行实验。否则,我认为 4096(大多数平台的页面大小)或以上就可以了。

顺便说一下,RapidJSON 是开源的,这个类非常简单。只需阅读此 头文件,您就会知道如何使用缓冲区。

顺便说一下,在这里使用vector<>不是一个好的做法。因为vector<>需要堆分配,而这里只需要固定大小。使用程序栈更加经济实惠。


所以,我采纳了你的建议,将缓冲区大小设置为4096。一般来说,我主要用它来读取设置文件,这些文件不会太大。谢谢! - user3339357

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接