我目前正在进行一个涉及读取数千个小型(约20kb)ASCII格式文本文件的C ++项目。
在分析这些文件之前,将它们全部转换为二进制格式能否显著提高性能?
我目前正在进行一个涉及读取数千个小型(约20kb)ASCII格式文本文件的C ++项目。
在分析这些文件之前,将它们全部转换为二进制格式能否显著提高性能?
将字符串转换为数字虽然会消耗一定的CPU周期,但这并不是问题。与输入/输出(I/O)相关的开销总是比转换大得多。文件的大小也不是太大的问题,磁盘提供8KB的速度大约与20KB相同,它们都来自磁道上的同一簇。拥有数千个文件是一个大问题,打开文件涉及移动磁盘读头,这需要很长时间。
因此,专注于减少文件数量才能真正获得收益。
如果你处理文本,那么"ASCII"和"Binary"之间没有真正的区别。ASCII是将二进制数据解释为文本的一种方式。所以,如果我正确理解了你的问题,答案是否定的。无法进行转换,也不会有性能提升。
二进制格式存储数据有两个优点:
因此,如果将文本表示转换为紧凑的二进制格式,则会有性能提升,但其是否显著取决于您的特定情况。
如果数据流已经成为性能瓶颈,则切换到二进制格式(甚至压缩 - 从磁盘读取本来就很慢)可能会带来很多好处。
当二进制格式使得你可以最小化任何解析需求时,你可以在加载时获得性能提升。例如,内容可以被转储为大块,直接映射到“结构体转储”中。每一步进一步的操作都可能会损失性能。这是否比ASCII更快部分取决于ASCII本身的复杂性/低效性。
即使是在二进制中,也会有成本的步骤:
如果你确定执行时间的大部分是用于加载和解析,但你只需要对固定数据集执行一次,另一个选择可能是使用线程。设置一堆并行工作程序来加载数据,然后将其放置在队列中进行分析。
很可能是的。但这样一来,就无法通过检查验证输入文件了,你将不得不花时间编写代码进行转码,并编写新代码来读取它们。只有在发现I/O时间是一个重大问题时才建议这样做。