From 386049897265177ba8cb0156757fe4bf64aaa9b3 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Wed, 14 Sep 2022 17:11:12 -0700 Subject: [PATCH] Fix performance regression. (#111615) --- .../lib/src/foundation/change_notifier.dart | 26 ++++------ .../src/foundation/memory_allocations.dart | 52 +++++++------------ .../foundation/memory_allocations_test.dart | 16 +++--- 3 files changed, 39 insertions(+), 55 deletions(-) diff --git a/packages/flutter/lib/src/foundation/change_notifier.dart b/packages/flutter/lib/src/foundation/change_notifier.dart index 671f76652b..d742bd8c54 100644 --- a/packages/flutter/lib/src/foundation/change_notifier.dart +++ b/packages/flutter/lib/src/foundation/change_notifier.dart @@ -215,13 +215,11 @@ class ChangeNotifier implements Listenable { void addListener(VoidCallback listener) { assert(ChangeNotifier.debugAssertNotDisposed(this)); if (kFlutterMemoryAllocationsEnabled && !_creationDispatched) { - MemoryAllocations.instance.dispatchObjectEvent(() { - return ObjectCreated( - library: _flutterFoundationLibrary, - className: 'ChangeNotifier', - object: this, - ); - }); + MemoryAllocations.instance.dispatchObjectEvent(ObjectCreated( + library: _flutterFoundationLibrary, + className: 'ChangeNotifier', + object: this, + )); _creationDispatched = true; } if (_count == _listeners.length) { @@ -328,7 +326,7 @@ class ChangeNotifier implements Listenable { return true; }()); if (kFlutterMemoryAllocationsEnabled && _creationDispatched) { - MemoryAllocations.instance.dispatchObjectEvent(() => ObjectDisposed(object: this)); + MemoryAllocations.instance.dispatchObjectEvent(ObjectDisposed(object: this)); } _listeners = _emptyListeners; _count = 0; @@ -466,13 +464,11 @@ class ValueNotifier extends ChangeNotifier implements ValueListenable { /// Creates a [ChangeNotifier] that wraps this value. ValueNotifier(this._value) { if (kFlutterMemoryAllocationsEnabled) { - MemoryAllocations.instance.dispatchObjectEvent(() { - return ObjectCreated( - library: _flutterFoundationLibrary, - className: 'ValueNotifier', - object: this, - ); - }); + MemoryAllocations.instance.dispatchObjectEvent(ObjectCreated( + library: _flutterFoundationLibrary, + className: 'ValueNotifier', + object: this, + )); } _creationDispatched = true; } diff --git a/packages/flutter/lib/src/foundation/memory_allocations.dart b/packages/flutter/lib/src/foundation/memory_allocations.dart index c209aebeb9..d47f70f30a 100644 --- a/packages/flutter/lib/src/foundation/memory_allocations.dart +++ b/packages/flutter/lib/src/foundation/memory_allocations.dart @@ -12,11 +12,11 @@ const bool _kMemoryAllocations = bool.fromEnvironment('flutter.memory_allocation /// If true, Flutter objects dispatch the memory allocation events. /// -/// By default, the constant is true for profile and debug mode and false -/// for release mode, for app size optimization goals. +/// By default, the constant is true for debug mode and false +/// for profile and release modes. /// To enable the dispatching for release mode, pass the compilation flag /// `--dart-define=flutter.memory_allocations=true`. -const bool kFlutterMemoryAllocationsEnabled = _kMemoryAllocations || kProfileMode || kDebugMode; +const bool kFlutterMemoryAllocationsEnabled = _kMemoryAllocations || kDebugMode; const String _dartUiLibrary = 'dart:ui'; @@ -54,9 +54,6 @@ abstract class ObjectEvent{ /// A listener of [ObjectEvent]. typedef ObjectEventListener = void Function(ObjectEvent); -/// A builder of [ObjectEvent]. -typedef ObjectEventBuilder = ObjectEvent Function(); - /// An event that describes creation of an object. class ObjectCreated extends ObjectEvent { /// Creates an instance of [ObjectCreated]. @@ -225,7 +222,7 @@ class MemoryAllocations { /// after the removal. /// /// Only call this when [kFlutterMemoryAllocationsEnabled] is true. - void dispatchObjectEvent(ObjectEventBuilder objectEventBuilder) { + void dispatchObjectEvent(ObjectEvent event) { if (!kFlutterMemoryAllocationsEnabled) { return; } @@ -234,7 +231,6 @@ class MemoryAllocations { return; } - final ObjectEvent event = objectEventBuilder(); _activeDispatchLoops++; final int end = listeners.length; for (int i = 0; i < end; i++) { @@ -285,38 +281,30 @@ class MemoryAllocations { } void _imageOnCreate(ui.Image image) { - dispatchObjectEvent(() { - return ObjectCreated( - library: _dartUiLibrary, - className: 'Image', - object: image, - ); - }); + dispatchObjectEvent(ObjectCreated( + library: _dartUiLibrary, + className: 'Image', + object: image, + )); } void _pictureOnCreate(ui.Picture picture) { - dispatchObjectEvent(() { - return ObjectCreated( - library: _dartUiLibrary, - className: 'Picture', - object: picture, - ); - }); + dispatchObjectEvent(ObjectCreated( + library: _dartUiLibrary, + className: 'Picture', + object: picture, + )); } void _imageOnDispose(ui.Image image) { - dispatchObjectEvent(() { - return ObjectDisposed( - object: image, - ); - }); + dispatchObjectEvent(ObjectDisposed( + object: image, + )); } void _pictureOnDispose(ui.Picture picture) { - dispatchObjectEvent(() { - return ObjectDisposed( - object: picture, - ); - }); + dispatchObjectEvent(ObjectDisposed( + object: picture, + )); } } diff --git a/packages/flutter/test/foundation/memory_allocations_test.dart b/packages/flutter/test/foundation/memory_allocations_test.dart index f30a67be5d..ecfb737cc2 100644 --- a/packages/flutter/test/foundation/memory_allocations_test.dart +++ b/packages/flutter/test/foundation/memory_allocations_test.dart @@ -24,13 +24,13 @@ void main() { ma.addListener(listener); _checkSdkHandlersSet(); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(recievedEvent, equals(event)); expect(ma.hasListeners, isTrue); recievedEvent = null; ma.removeListener(listener); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(recievedEvent, isNull); expect(ma.hasListeners, isFalse); _checkSdkHandlersNotSet(); @@ -56,7 +56,7 @@ void main() { ma.addListener(badListener2); ma.addListener(listener2); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(log, ['badListener1', 'listener1', 'badListener2','listener2']); expect(tester.takeException(), contains('Multiple exceptions (2)')); @@ -69,7 +69,7 @@ void main() { log.clear(); expect(ma.hasListeners, isFalse); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(log, []); }); @@ -86,11 +86,11 @@ void main() { ma.addListener(listener1); _checkSdkHandlersSet(); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(log, ['listener1']); log.clear(); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(log, ['listener1','listener2']); log.clear(); @@ -99,7 +99,7 @@ void main() { _checkSdkHandlersNotSet(); expect(ma.hasListeners, isFalse); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(log, []); }); @@ -117,7 +117,7 @@ void main() { ma.addListener(listener1); ma.addListener(listener2); - ma.dispatchObjectEvent(() => event); + ma.dispatchObjectEvent(event); expect(log, ['listener1']); log.clear();