ASCII还是二进制,哪个读取速度更快?

4

我目前正在进行一个涉及读取数千个小型(约20kb)ASCII格式文本文件的C ++项目。

在分析这些文件之前,将它们全部转换为二进制格式能否显著提高性能?


这取决于您正在读取的数据是数字(以 ASCII 字符形式存储在文件中的数字)还是基于文本的。如果是数字,那么如果您使用二进制读/写,肯定会获得性能提升。为什么?因为计算机不必在文件和内存中的二进制数字之间进行文本数字转换。如果文件中的数据是文本本身,则几乎没有什么可获得的。由于这是10.5年前的问题,我猜测 OP 已经走了,所以这是给路人的信息。 - jvriesem
5个回答

11

将字符串转换为数字虽然会消耗一定的CPU周期,但这并不是问题。与输入/输出(I/O)相关的开销总是比转换大得多。文件的大小也不是太大的问题,磁盘提供8KB的速度大约与20KB相同,它们都来自磁道上的同一簇。拥有数千个文件是一个问题,打开文件涉及移动磁盘读头,这需要很长时间。

因此,专注于减少文件数量才能真正获得收益。


6

如果你处理文本,那么"ASCII"和"Binary"之间没有真正的区别。ASCII是将二进制数据解释为文本的一种方式。所以,如果我正确理解了你的问题,答案是否定的。无法进行转换,也不会有性能提升。


原帖中提到他们正在读取“文本文件”,如果数据作为字符串有意义,那么你是正确的。然而,人们也可以将格式化的数字数据存储在“文本文件”中。如果是这种情况,如果计算机能够以其本地语言(二进制)读/写数字,那么I/O速度会快得多,而不必在ASCII字符和二进制数字之间进行转换。不过,原帖的问题还有点不清楚。 - jvriesem

5

二进制格式存储数据有两个优点:

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

因此,如果将文本表示转换为紧凑的二进制格式,则会有性能提升,但其是否显著取决于您的特定情况。

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


“无需耗时的字符串解析” - 这是什么意思?您仍然需要解析输入以将其存储在数据结构中,对吗? - Korchkidu

1

当二进制格式使得你可以最小化任何解析需求时,你可以在加载时获得性能提升。例如,内容可以被转储为大块,直接映射到“结构体转储”中。每一步进一步的操作都可能会损失性能。这是否比ASCII更快部分取决于ASCII本身的复杂性/低效性。

即使是在二进制中,也会有成本的步骤:

  • 压缩
  • 平台无关性
  • 可变内容
  • 从ASCII更改内容需要更新二进制

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


0

很可能是的。但这样一来,就无法通过检查验证输入文件了,你将不得不花时间编写代码进行转码,并编写新代码来读取它们。只有在发现I/O时间是一个重大问题时才建议这样做。


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