什么是更快阅读,ASCII或二进制?

时间:2011-03-27 21:42:48

标签: c++ file-io iostream

我目前正致力于一个C ++项目,该项目涉及读取数千个小型(~20kb)文本文件,这些文件都是ASCII格式。

通过在分析之前将所有文件转换为二进制文件,我能否获得显着的性能提升?

5 个答案:

答案 0 :(得分:11)

将字符串转换为数字虽然在cpu周期中不便宜,但却不是问题。 I / O涉及的开销量总是比转换大几个数量级。文件的大小也不是问题,磁盘提供的速度大约为20KB,大约为20KB,它们都来自同一磁道上的同一个集群。拥有数千个文件是 big 问题,打开文件涉及移动磁盘阅读器头,这需要永远。

因此,请专注于削减文件数量以获得实际收益。

答案 1 :(得分:6)

如果您正在处理文本,“ASCII”和“二进制”之间没有真正的区别。 ASCII是将二进制数据解释为文本。所以,如果我正确理解你的问题,答案是否定的,没有可能的转换,也没有性能改进。

答案 2 :(得分:3)

以二进制格式存储数据有两个好处:

  • 占用较少的存储空间(较少的磁盘IO)
  • 读取速度更快(没有耗时的字符串解析)

如果您将文本表示转换为紧凑的二进制格式,那么将会有性能改进,但如果它们重要取决于您的特定情况。

如果数据流 已经是性能瓶颈,那么切换到二进制格式(甚至可能是压缩 - 从磁盘读取本身就很慢)会带来很多。

答案 3 :(得分:0)

可能,是的。但是,通过检查验证输入文件是不可能的,你将不得不花时间编写代码来对它们进行转码,并使用新代码来读取它们。如果您发现I / O时间是一个重大问题,我只会这样做。

答案 4 :(得分:0)

当二进制格式因此最小化任何解析要求时,您可以在加载时获得性能提升。例如,可以将内容转储到直接映射到“struct dump”的大块中。反过来又进一步的步骤可能会让您失去性能。这最终是否远远领先于ASCII将部分取决于ASCII的复杂性/低效性。

即使在二进制文件中花费你的步骤也包括:

  • 压缩
  • 平台独立性
  • 可变内容
  • 对需要从ASCII
  • 更新二进制文件的内容进行更改

如果您确定大部分执行时间是加载和解析,但是您只对固定数据集执行一次,则另一个选项可能是使用线程。设置一组并行工作程序,加载数据,然后将其放在队列中进行分析。