sdk icon indicating copy to clipboard operation
sdk copied to clipboard

[VM/AOT] Using records as Map keys is slow on AOT

Open mkustermann opened this issue 3 weeks ago • 2 comments

Even though https://github.com/dart-lang/sdk/issues/60419 was closed there's still perf issues with record types in maps.

void main() {
  final strings = <String>[for (int i = 0; i < 1_000_000; ++i) '$i'];

  final sw = Stopwatch()..start();
  final m = <(int, List<String>), String>{};

  for (int i = 0; i < 1_000_000; i++) {
    m.putIfAbsent((i, strings), () => strings[i]);
  }
  print(sw.elapsed);
}
%  pkg/vm/tool/precompiler2 test.dart test.aot
% out/ReleaseX64/dartaotruntime test.aot
0:00:01.051103

with this profile:

+   13.76%  DartWorker       dartaotruntime        [.] dart::Object::HandleImpl(dart::Zone*, dart::ObjectPtr, long)
+    9.61%  DartWorker       test.aot              [.] _LinkedHashMapMixin._findValueOrInsertPoint
+    9.41%  DartWorker       dartaotruntime        [.] dart::Class::IsSubtypeOf(dart::Class const&, dart::TypeArguments const&, dart::Nullability, dart::AbstractType const&, dart::Heap::Space, dart::FunctionTypeMapping
+    7.90%  DartWorker       dartaotruntime        [.] dart::VMHandles::AllocateHandle(dart::Zone*)
+    4.25%  DartWorker       dartaotruntime        [.] dart::Instance::RuntimeTypeIsSubtypeOf(dart::AbstractType const&, dart::TypeArguments const&, dart::TypeArguments const&) const
+    3.45%  DartWorker       test.aot              [.] _Record.==
+    3.40%  DartWorker       dartaotruntime        [.] dart::Type::type_class() const
+    3.21%  DartWorker       dartaotruntime        [.] dart::AbstractType::operator=(dart::AbstractTypePtr)
+    3.00%  DartWorker       dartaotruntime        [.] dart::Type::type_class_id() const
+    2.52%  DartWorker       dartaotruntime        [.] dart::MarkingVisitor::VisitPointers(dart::ObjectPtr*, dart::ObjectPtr*)
+    2.22%  DartWorker       test.aot              [.] _Record.hashCode
+    2.09%  DartWorker       dartaotruntime        [.] dart::TypeArguments::IsUninstantiatedIdentity() const
+    1.77%  DartWorker       dartaotruntime        [.] DRT_TypeCheck

mkustermann avatar Nov 14 '25 08:11 mkustermann