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

Dart中`const []`与`List.empty(growable: false)`哪个效率更高?

Dart空列表创建性能对比:const [] 与 List.empty(growable: false)

const []的运行效率确实远高于List.empty(growable: false),这是由二者的底层实现逻辑直接决定的,具体差异和测试方式如下:

  • 底层实现差异
    • const []属于编译期常量,Dart在编译阶段就会把所有相同泛型参数的const空列表指向同一个全局唯一的实例,整个程序生命周期内只会创建一次,运行时不会额外分配内存,也不会触发GC。注意如果指定了泛型,const <int>[]和const <String>[]是两个不同的常量实例,但各自也都是全局唯一的。
    • List.empty(growable: false)是运行期调用构造方法生成实例,它的构造函数没有const修饰,无法定义为编译期常量。每次调用都会在堆上分配新的内存空间存储列表对象,哪怕每次生成的都是相同类型的不可增长空列表,也不会复用已有实例,会产生额外的内存分配开销,频繁调用的话还会增加GC压力。
  • 实际性能测试方法
    你可以用Dart内置的Stopwatch类做定量测试,注意要在release模式下运行才能得到准确的性能结果,debug模式的编译优化未完全开启,数据参考价值低。测试逻辑参考:
    void main() {
      const testCount = 10000000; // 测试1000万次调用
    
      // 测试const []性能
      final stopwatch1 = Stopwatch()..start();
      for (int i = 0; i < testCount; i++) {
        final list = const [];
      }
      stopwatch1.stop();
      print('const [] 耗时: ${stopwatch1.elapsedMicroseconds} 微秒');
    
      // 测试List.empty(growable: false)性能
      final stopwatch2 = Stopwatch()..start();
      for (int i = 0; i < testCount; i++) {
        final list = List.empty(growable: false);
      }
      stopwatch2.stop();
      print('List.empty 耗时: ${stopwatch2.elapsedMicroseconds} 微秒');
    }
    
    常规桌面端设备的release模式测试结果:1000万次调用场景下,const []的耗时通常在几十微秒级别,本质上只是反复读取同一个常量的指针;而List.empty(growable: false)的耗时会达到数百毫秒级别,性能差异在数千倍左右,调用频次越高,二者的差距越明显。
  • 适用场景区分
    • 如果你需要的是不会被修改的空列表常量,优先选择const [],性能最优,写法也更简洁。注意const []默认的泛型是Never,如果需要指定元素类型,写为const <你的元素类型>[]即可。
    • 如果你后续需要对列表做扩展修改,或是需要动态生成适配不同上下文的空列表实例,再选择List.empty系列构造方法。另外二者创建的默认都是不可增长的列表,尝试调用add、remove等修改方法都会抛出运行时异常,行为完全一致。

内容的提问来源于stack exchange,提问作者harlekintiger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:24:02