Unverified Commit 38604989 authored by Polina Cherkasova's avatar Polina Cherkasova Committed by GitHub

Fix performance regression. (#111615)

parent 96b49aae
...@@ -215,13 +215,11 @@ class ChangeNotifier implements Listenable { ...@@ -215,13 +215,11 @@ class ChangeNotifier implements Listenable {
void addListener(VoidCallback listener) { void addListener(VoidCallback listener) {
assert(ChangeNotifier.debugAssertNotDisposed(this)); assert(ChangeNotifier.debugAssertNotDisposed(this));
if (kFlutterMemoryAllocationsEnabled && !_creationDispatched) { if (kFlutterMemoryAllocationsEnabled && !_creationDispatched) {
MemoryAllocations.instance.dispatchObjectEvent(() { MemoryAllocations.instance.dispatchObjectEvent(ObjectCreated(
return ObjectCreated( library: _flutterFoundationLibrary,
library: _flutterFoundationLibrary, className: 'ChangeNotifier',
className: 'ChangeNotifier', object: this,
object: this, ));
);
});
_creationDispatched = true; _creationDispatched = true;
} }
if (_count == _listeners.length) { if (_count == _listeners.length) {
...@@ -328,7 +326,7 @@ class ChangeNotifier implements Listenable { ...@@ -328,7 +326,7 @@ class ChangeNotifier implements Listenable {
return true; return true;
}()); }());
if (kFlutterMemoryAllocationsEnabled && _creationDispatched) { if (kFlutterMemoryAllocationsEnabled && _creationDispatched) {
MemoryAllocations.instance.dispatchObjectEvent(() => ObjectDisposed(object: this)); MemoryAllocations.instance.dispatchObjectEvent(ObjectDisposed(object: this));
} }
_listeners = _emptyListeners; _listeners = _emptyListeners;
_count = 0; _count = 0;
...@@ -466,13 +464,11 @@ class ValueNotifier<T> extends ChangeNotifier implements ValueListenable<T> { ...@@ -466,13 +464,11 @@ class ValueNotifier<T> extends ChangeNotifier implements ValueListenable<T> {
/// Creates a [ChangeNotifier] that wraps this value. /// Creates a [ChangeNotifier] that wraps this value.
ValueNotifier(this._value) { ValueNotifier(this._value) {
if (kFlutterMemoryAllocationsEnabled) { if (kFlutterMemoryAllocationsEnabled) {
MemoryAllocations.instance.dispatchObjectEvent(() { MemoryAllocations.instance.dispatchObjectEvent(ObjectCreated(
return ObjectCreated( library: _flutterFoundationLibrary,
library: _flutterFoundationLibrary, className: 'ValueNotifier',
className: 'ValueNotifier', object: this,
object: this, ));
);
});
} }
_creationDispatched = true; _creationDispatched = true;
} }
......
...@@ -12,11 +12,11 @@ const bool _kMemoryAllocations = bool.fromEnvironment('flutter.memory_allocation ...@@ -12,11 +12,11 @@ const bool _kMemoryAllocations = bool.fromEnvironment('flutter.memory_allocation
/// If true, Flutter objects dispatch the memory allocation events. /// If true, Flutter objects dispatch the memory allocation events.
/// ///
/// By default, the constant is true for profile and debug mode and false /// By default, the constant is true for debug mode and false
/// for release mode, for app size optimization goals. /// for profile and release modes.
/// To enable the dispatching for release mode, pass the compilation flag /// To enable the dispatching for release mode, pass the compilation flag
/// `--dart-define=flutter.memory_allocations=true`. /// `--dart-define=flutter.memory_allocations=true`.
const bool kFlutterMemoryAllocationsEnabled = _kMemoryAllocations || kProfileMode || kDebugMode; const bool kFlutterMemoryAllocationsEnabled = _kMemoryAllocations || kDebugMode;
const String _dartUiLibrary = 'dart:ui'; const String _dartUiLibrary = 'dart:ui';
...@@ -54,9 +54,6 @@ abstract class ObjectEvent{ ...@@ -54,9 +54,6 @@ abstract class ObjectEvent{
/// A listener of [ObjectEvent]. /// A listener of [ObjectEvent].
typedef ObjectEventListener = void Function(ObjectEvent); typedef ObjectEventListener = void Function(ObjectEvent);
/// A builder of [ObjectEvent].
typedef ObjectEventBuilder = ObjectEvent Function();
/// An event that describes creation of an object. /// An event that describes creation of an object.
class ObjectCreated extends ObjectEvent { class ObjectCreated extends ObjectEvent {
/// Creates an instance of [ObjectCreated]. /// Creates an instance of [ObjectCreated].
...@@ -225,7 +222,7 @@ class MemoryAllocations { ...@@ -225,7 +222,7 @@ class MemoryAllocations {
/// after the removal. /// after the removal.
/// ///
/// Only call this when [kFlutterMemoryAllocationsEnabled] is true. /// Only call this when [kFlutterMemoryAllocationsEnabled] is true.
void dispatchObjectEvent(ObjectEventBuilder objectEventBuilder) { void dispatchObjectEvent(ObjectEvent event) {
if (!kFlutterMemoryAllocationsEnabled) { if (!kFlutterMemoryAllocationsEnabled) {
return; return;
} }
...@@ -234,7 +231,6 @@ class MemoryAllocations { ...@@ -234,7 +231,6 @@ class MemoryAllocations {
return; return;
} }
final ObjectEvent event = objectEventBuilder();
_activeDispatchLoops++; _activeDispatchLoops++;
final int end = listeners.length; final int end = listeners.length;
for (int i = 0; i < end; i++) { for (int i = 0; i < end; i++) {
...@@ -285,38 +281,30 @@ class MemoryAllocations { ...@@ -285,38 +281,30 @@ class MemoryAllocations {
} }
void _imageOnCreate(ui.Image image) { void _imageOnCreate(ui.Image image) {
dispatchObjectEvent(() { dispatchObjectEvent(ObjectCreated(
return ObjectCreated( library: _dartUiLibrary,
library: _dartUiLibrary, className: 'Image',
className: 'Image', object: image,
object: image, ));
);
});
} }
void _pictureOnCreate(ui.Picture picture) { void _pictureOnCreate(ui.Picture picture) {
dispatchObjectEvent(() { dispatchObjectEvent(ObjectCreated(
return ObjectCreated( library: _dartUiLibrary,
library: _dartUiLibrary, className: 'Picture',
className: 'Picture', object: picture,
object: picture, ));
);
});
} }
void _imageOnDispose(ui.Image image) { void _imageOnDispose(ui.Image image) {
dispatchObjectEvent(() { dispatchObjectEvent(ObjectDisposed(
return ObjectDisposed( object: image,
object: image, ));
);
});
} }
void _pictureOnDispose(ui.Picture picture) { void _pictureOnDispose(ui.Picture picture) {
dispatchObjectEvent(() { dispatchObjectEvent(ObjectDisposed(
return ObjectDisposed( object: picture,
object: picture, ));
);
});
} }
} }
...@@ -24,13 +24,13 @@ void main() { ...@@ -24,13 +24,13 @@ void main() {
ma.addListener(listener); ma.addListener(listener);
_checkSdkHandlersSet(); _checkSdkHandlersSet();
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(recievedEvent, equals(event)); expect(recievedEvent, equals(event));
expect(ma.hasListeners, isTrue); expect(ma.hasListeners, isTrue);
recievedEvent = null; recievedEvent = null;
ma.removeListener(listener); ma.removeListener(listener);
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(recievedEvent, isNull); expect(recievedEvent, isNull);
expect(ma.hasListeners, isFalse); expect(ma.hasListeners, isFalse);
_checkSdkHandlersNotSet(); _checkSdkHandlersNotSet();
...@@ -56,7 +56,7 @@ void main() { ...@@ -56,7 +56,7 @@ void main() {
ma.addListener(badListener2); ma.addListener(badListener2);
ma.addListener(listener2); ma.addListener(listener2);
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(log, <String>['badListener1', 'listener1', 'badListener2','listener2']); expect(log, <String>['badListener1', 'listener1', 'badListener2','listener2']);
expect(tester.takeException(), contains('Multiple exceptions (2)')); expect(tester.takeException(), contains('Multiple exceptions (2)'));
...@@ -69,7 +69,7 @@ void main() { ...@@ -69,7 +69,7 @@ void main() {
log.clear(); log.clear();
expect(ma.hasListeners, isFalse); expect(ma.hasListeners, isFalse);
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(log, <String>[]); expect(log, <String>[]);
}); });
...@@ -86,11 +86,11 @@ void main() { ...@@ -86,11 +86,11 @@ void main() {
ma.addListener(listener1); ma.addListener(listener1);
_checkSdkHandlersSet(); _checkSdkHandlersSet();
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(log, <String>['listener1']); expect(log, <String>['listener1']);
log.clear(); log.clear();
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(log, <String>['listener1','listener2']); expect(log, <String>['listener1','listener2']);
log.clear(); log.clear();
...@@ -99,7 +99,7 @@ void main() { ...@@ -99,7 +99,7 @@ void main() {
_checkSdkHandlersNotSet(); _checkSdkHandlersNotSet();
expect(ma.hasListeners, isFalse); expect(ma.hasListeners, isFalse);
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(log, <String>[]); expect(log, <String>[]);
}); });
...@@ -117,7 +117,7 @@ void main() { ...@@ -117,7 +117,7 @@ void main() {
ma.addListener(listener1); ma.addListener(listener1);
ma.addListener(listener2); ma.addListener(listener2);
ma.dispatchObjectEvent(() => event); ma.dispatchObjectEvent(event);
expect(log, <String>['listener1']); expect(log, <String>['listener1']);
log.clear(); log.clear();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment