C++:存储数据或连续读取数据效率更高吗

C++: Is it more efficient to store data or continually read it

好的,我正在做一个游戏项目。刚刚完成重建我前段时间设计的游戏引擎。我正在考虑制作专有文件类型来存储数据,而不是使用像 sqlite 这样的数据库。

着眼于在不深入研究的情况下尽可能高效、快速地在游戏中进行这项工作。然后随着时间的推移不断改进。

我的问题是:从文件中加载数据并将其存储在数据管理器中以供重用是否总体上更高效?class还是持续从文件中提取整体效率更高?

假设文件的数据遵循某种形式的一致结构。我们正在查看最大的 "table" 大约有 30 列和大约 1000 行数据。

如果可以将数据保存在 RAM 中,效率会更高。这是因为您的计算机访问 RAM、缓存或 CPU 寄存器中的值比从硬盘驱动器中获取值更快。从硬盘驱动器读取需要操作系统驱动程序花费大量时间;因此保存数据更有效率

从文件中继续读取通常不是一个好主意;现代操作系统确实保留了大量的 IO 缓存(因此,如果您继续读取相同的内容,它不会 真正 访问磁盘),但是系统调用当然比直接访问内存更繁重 -但是,根据您提供的信息,无法判断这是否真的会成为您具体案例的性能问题。另一方面,如果您有大量数据要访问,将它们全部保存在内存中可能会造成浪费、加载​​缓慢,并且在内存压力下会导致分页。

解决这个难题的简单方法是将文件映射到内存中;数据会在需要时自动从磁盘中获取,除非系统内存压力大,否则经常访问的页面会保留在 RAM 中缓存,以保证您快速访问。

当然这只有当你需要映射的数据小于地址space时才可行,但考虑到你提供的例子(30columns/1000行,这确实很小)根本不应该成为问题。

这是 "Latency Numbers Every Computer Programmer Should Know"

的便捷图表

图表的最右侧(红色)显示从磁盘读取 1 MB 所需的时间。绿色列具有从 RAM 读取的相同值。

这向我们表明,您应该几乎可以做任何事情,以避免直接与磁盘交互。将数据保存在 RAM 中很好。将数据保存在磁盘上是不好的。 (内存映射文件可能提供了一种处理此问题的方法。)

除此之外,重新发明轮子几乎总是错误的解决方案。 Sqlite 运行良好。如果它不太适合您的需要,还有其他文件类型。

如果您“着眼于立即让游戏尽可能高效、快速地发挥作用,而不是深入研究它。然后随着时间的推移进行改进 ",您会发现,如果您对常见问题重复使用已有的解决方案,那将是最容易做到的。