Performance IndexedDB访问速度和效率

Performance IndexedDB访问速度和效率,performance,hashmap,dart,game-engine,indexeddb,Performance,Hashmap,Dart,Game Engine,Indexeddb,我正在Dart中开发一个RPG,我将使用IndexedDB进行数据持久化 我将有两个数据库:一个用于只读访问,另一个用于存储保存游戏的读写访问。我只是想知道是否应该直接从数据库中读取所需的数据,或者将其缓存在地图中。我可能有几百条记录需要从只读数据库(敌人、游戏地图等)中提取,我认为从数据库中提取所有记录可能比使用Dart地图效率低 哦,而且每个数据库都会存储在地图中。对象存储将是该贴图中的嵌套贴图 我应该直接从数据库中读取数据,还是应该将所有内容都放到地图中并从那里读取数据 编辑:忘了提一下,

我正在Dart中开发一个RPG,我将使用IndexedDB进行数据持久化

我将有两个数据库:一个用于只读访问,另一个用于存储保存游戏的读写访问。我只是想知道是否应该直接从数据库中读取所需的数据,或者将其缓存在地图中。我可能有几百条记录需要从只读数据库(敌人、游戏地图等)中提取,我认为从数据库中提取所有记录可能比使用Dart地图效率低

哦,而且每个数据库都会存储在地图中。对象存储将是该贴图中的嵌套贴图

我应该直接从数据库中读取数据,还是应该将所有内容都放到地图中并从那里读取数据


编辑:忘了提一下,只读数据库将使用位于用户机器上的JSON文件中的数据初始化,而不是通过AJAX。

我将使用直接数据库访问,然后监控性能,然后优化预期的显著收益。过早优化很少是个好主意

我相信,在IndexedDB中,数百条记录不会给您带来任何问题。IDB的设计考虑到了这种规模,它的异步API——虽然让新手感到烦恼——确保你的应用程序在设计上保持响应

我正在做一个演示,旨在推动IDB比它应该走的更远,并为您提供一些易于获取的统计数据。这些是数据库中单个存储中单个索引上的获取

在IndexedDB中,GET的速度非常快。IDB在规模上的问题通常是写入。

一千次成功回调,一次完整回调,时间不到一秒:

一万次成功回调,一次完整回调,大约5秒:

在不到一分钟的时间内启动了五万多个成功回调:

写的速度要慢得多——一开始很急促,但几分钟后就慢了,几小时后就慢了。对于任何模式都是这样,但您可能在位置上有多个索引(我想至少是纬度和经度),因此您的写入速度会特别慢(索引越多,需要做的工作就越多,以便将这些索引主要放在插入和更新中)

上述统计数据的布局(与统计数据本身一样重要,请确保根据访问模式的需要设计模式):


我不认为1k读/秒的速度快得惊人。这是C#中哈希表的1/10000。JavaScript映射可能提供介于两者之间的性能,但比IDB高出几个数量级。好的一点是,这种观点确实取决于您将这些数字与之进行比较的标准。对我来说,当你将这种本地访问与网络传输进行比较时——打开一个HTTP连接并在地球上发送数据包——“快速燃烧”并不是一种错误的描述。与C#相比,也许你是对的。@editor-是的,我不是建议Redis作为IndexedDB的替代品,它们是不可交换的,但是如果Redis在网络上可以这么快,为什么IndexedDB在我的本地硬盘上那么慢?我是IDB的粉丝,但我不会搞错:我的数字是通过IDB中间件实现的,中间件速度很慢。仅仅为了统计目的而观察i/o的行为就足以让一切都慢下来。为了获得数字,我有一个插件,它观察输入和输出以计算吞吐量(意味着每个回调都会调用额外的函数)。当我们以每秒数百或数千次的速度运行时,仅此一项就足以显著扭曲结果。这还取决于您如何向IDB写入数据。如果您在单个事务中完成所有操作,那么每次写入都比事务快。而且,这在很大程度上取决于浏览器。我的经验是IE是最快的,但我看到其他浏览器正在缩小差距。昨天我还查看了批插入性能。50k记录现在在+/-10秒内添加。接下来的问题是:定义直接数据库?对不起,我的手机上有。“直接数据库”不得不重新阅读你的答案来理解它,我有时是如此盲目:p