如果你想提高性能,你将不得不使用固定长度的字段。解析或加载可变长度字段不会显着提高性能。按文本行读取涉及扫描行尾标记。扫描浪费时间。
在使用以下任何建议之前,请分析您的代码以建立基准时间或性能数字。在每个建议之后执行此操作,因为它可以让您计算每个优化的性能增量。我的预测是每次优化后增量都会变小。
我建议首先将文件转换为固定长度的记录,仍然使用文本。根据需要用空格填充字段。因此,知道记录的大小后,您可以阻止读取到内存并将内存视为一个数组。这应该提供显着的改进。
在这一点上,您的瓶颈仍然是文件 I/O 速度,您无法真正做出重大改进(因为文件 I/O 由操作系统控制),以及扫描/转换文本。一些进一步的优化是:将文本转换为数字,最后转换为二进制。 不惜一切代价,更愿意以人类可读的形式保存数据文件。
在降低数据文件的可读性之前,请尝试将应用程序拆分为线程。一个线程处理 GUI,另一个处理输入,另一个处理处理。这个想法是让处理器总是执行你的一些代码而不是等待。在现代平台中,可以在 CPU 处理代码时执行文件 I/O。
如果您不关心可移植性,请查看您的平台是否具有 DMA 功能(DMA 或直接内存访问组件允许在不使用处理器或最小化处理器使用的情况下传输数据)。需要注意的是,许多平台在处理器和 DMA 之间共享地址和数据总线。因此,一个组件被阻塞或挂起,而另一个组件使用地址和数据总线。所以它可能有帮助,也可能没有。取决于平台的连接方式。
将 key 字段转换为使用数字,也就是tokens。由于标记是数字的,它们可以用作跳转表(也可以是 switch 语句)的索引,或者只是数组的索引。
作为最后的手段,将文件转换为二进制文件。二进制版本应该有两个字段:作为令牌的键和值。将大块数据拖入内存。
概括
- 将大块数据拖入内存。
- 在进行更改以建立基线性能测量之前进行概要分析。
- 一次优化一个步骤,在每次优化后进行分析。
- 更喜欢以人类可读的形式保存数据文件。
- 尽量减少对数据文件的更改。
- 将文件转换为使用固定长度字段。
- 尝试使用线程或多任务,这样应用程序就不会等待。
- 将文本转换为数字标记(降低人类可读性)
- 将数据转换为二进制作为最后的手段(人类很难阅读和调试)。