C ++:存储数据或连续读取数据是否更有效

时间:2018-08-09 22:51:37

标签: c++ performance storage

好,所以我正在做一个游戏项目。刚刚完成重建我前一段时间设计的游戏引擎。我正在寻找一种专有文件类型来存储数据,而不是使用sqlite之类的数据库。

希望尽快有效地,迅速地将其用于游戏。然后随着时间的推移而改善。

我的问题是:从文件中加载数据并将其存储在要重用的数据管理器类中,整体上是否更有效率?还是从文件中连续提取总的来说效率更高?

假设文件遵循某种形式的数据一致性结构。而且我们正在寻找最大的“表”,例如大约30列,大约1000行的数据。

3 个答案:

答案 0 :(得分:4)

这是一个方便的图表,显示“每个计算机程序员都应该知道的延迟数字”

Latency numbers every computer programmer should know

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

这向我们显示的是,您应该做几乎所有事情,以避免必须直接与磁盘进行交互。将数据保留在RAM中是很好的。将数据保留在磁盘上是不好的。 (内存映射文件可能提供了一种解决方法。)

此外,重新发明轮子几乎总是错误的解决方案。 Sqlite工作正常。如果它不是最适合您的需求,则还有其他文件类型。

如果您“ 希望尽快有效地,迅速地将其用于游戏中,而又不必太深究。然后随着时间的推移而改进”,那么您将如果重复使用针对常见问题的既有解决方案,这是最容易做到的。

答案 1 :(得分:2)

通常不建议从文件中读取;现代操作系统确实会保留大量的IO缓存(因此,如果您继续读取相同的内容,它不会真正地进入磁盘),但是系统调用当然比直接访问内存更麻烦-尽管,是否实际上,这将是一个性能问题,因为您无法根据所提供的信息来判断您的特定情况。另一方面,如果您要访问大量数据,则将所有数据保存在内存中可能会浪费资源,加载缓慢,并且在内存压力下会导致分页。

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

当然,只有在您需要映射的数据小于地址空间的情况下,这才是可行的,但是给定您提供的示例(30列/ 1000行,这确实很小),这根本不是问题。 。

答案 2 :(得分:-1)

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