sdk
sdk copied to clipboard
[VM/AOT] Using records as Map keys is slow on AOT
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