Map类型按键取值原理、是否类SQL索引及查询耗时一致原因解析
Dart Map 按键查询的工作机制与耗时为0的原因
一、Map按键查找的工作机制,以及和SQL索引的区别
Dart里默认的Map(也就是你代码里用{}创建的)是用**哈希表(散列表)**实现的,查找逻辑可以类比小区的快递柜:
- 存
key:value时,会通过「哈希函数」把key转换成一个类似快递柜编号的数字,value直接存在对应编号的位置 - 查value时,再用同样的哈希函数算出编号,直接去对应位置取,不用挨个遍历所有元素
和SQL索引的区别:
- SQL的B树索引类似图书馆分类目录,按顺序排列,适合范围查询(比如查
id>100的所有数据) - Map的哈希表相当于自带了「哈希索引」,专门针对精准key查询优化,单条查询速度远快于遍历列表,只是结构和SQL索引不同,但核心都是快速定位目标
二、为什么代码里查询耗时全是0?
核心原因是测量精度不够,且Map查询本身太快:
DateTime.now().microsecondsSinceEpoch只能精确到微秒(1微秒=0.001毫秒),但Dart Map的哈希表查询通常只需要几纳秒(1纳秒=0.000001毫秒),远小于1微秒的测量单位,所以差值显示为0- 这就像用只能测分钟的手表去测眨眼时间,结果肯定是0分钟——眨眼太快,手表捕捉不到
- 另外Dart的即时编译(JIT)会优化频繁执行的代码,让查询速度进一步提升,更难测出耗时
三、怎么测出真实查询耗时?
可以把查询操作重复成千上万次,计算平均耗时,比如修改循环部分的代码:
for (var e in list) { print("\n$e"); int loopCount = 1000000; // 重复查询100万次 int startTime = DateTime.now().microsecondsSinceEpoch; for (int i=0; i<loopCount; i++) { map[e]; // 重复执行查询 } int totalTime = DateTime.now().microsecondsSinceEpoch - startTime; print("$e : ${map[e]} -> 平均单次耗时 = ${totalTime / loopCount} 微秒"); }
这样就能得到单次查询的真实耗时,通常是零点几微秒的水平。
内容的提问来源于stack exchange,提问作者Sittiphan Sittisak
相关产品推荐
相关产品推荐

