You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:31:23