我被告知,我的库比它慢应该是30+次太慢解析一个特定的文件(文本文件,大小326 KB)量级。用户建议,它可能是我使用std::ifstream(大概代替FILE)。

我宁愿不要一味地重写,所以我想我会在这里第一次检查,因为我的猜测是瓶颈是在其他地方。我读逐个字符,所以我使用的唯一功能是get()peek(),和tellg()/seekg()

<强>更新

我型材,并得到了混乱输出 - gprof的似乎没有想到过了这么长。我重写了程序,首先将整个文件读入缓冲区,它由约100倍的加速。我认为这个问题可能已经是花了很长的时间tellg()/seekg(),但gprof的可能已经无法看到,因为某些原因。在任何情况下,确实ifstream 的出现缓冲整个文件,即使对于这个大小。

有帮助吗?

解决方案

我不认为会有所作为。特别是如果你被烧焦阅读炭的I / O开销可能完全主宰的任何的东西。 为什么你一次读取单个字节?你知道它是多么极其低效?

在一个326KB文件,最快溶液将最有可能在一次只是读入存储器中。

的std :: ifstream的以及C当量之间的区别,基本上是一个虚拟函数调用或两个。它可以有所作为,如果执行的几十每秒百万次,否则,不雷尔。文件I / O通常是缓慢,在API用来访问它其实并不重要。更要紧的是读/写模式。寻求大量的是坏的,顺序读/写良好。

其他提示

这应该是稍微慢一些,但你所说的那样,它可能不会成为瓶颈。你为什么不分析您的程序,看看是否是这样?

我认为是不太可能你的问题将由fstream的切换到FILE *是固定的,通常都被C库缓冲。另外,操作系统可以缓存中读取(linux是在这方面非常好)。鉴于您正在访问文件的大小是相当有可能将完全在RAM中。

就像PolyThinker说,最好的办法是运行程序低谷的探查的确定问题出在哪里。

另外你正在使用seekg /所以tellg这可能会导致显着的延迟,如果你的硬盘大量碎片,因为阅读首次磁盘必须将磁头移到正确的位置的文件。

所有基准是恶。只是分析代码为您所期望的数据。

我执行红宝石,Python和Perl中,C ++一次之间的I / O性能的比较。对于我的数据,语言的版本等C ++的变体是几次慢(这是此时的大惊喜)。

我同意,你就应该剖析。但是,如果你正在阅读的文件中的角色在同一时间,有关创建内存映射文件怎么样?这样,你可以像对待一个字符数组的文件,操作系统应该照顾所有低级别的缓冲的为您服务。最简单和最快的可能解决方案是在我的书的胜利。 :)

这里是一个优异的基准,这表明,在极端条件下,fstreams实际上是相当慢...除非:

  1. 您使用缓冲(我不能强调足够)
  2. 您操作缓冲区自己(也就是,如果你需要的性能,例如在链接的问题OP),这是不使用FILE*如此不同。
  3. 您应该不会过早优化,虽然。 fstreams通常更好,如果你需要优化他们倒在路上,你总是可以以较小的代价去做以后。为了为最坏的提前准备,我建议创建fstream最小的代理,现在让你可以在以后优化它,而不需要其他任何东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top