Unverified Commit 97c1dede authored by Christopher Fujino's avatar Christopher Fujino Committed by GitHub

Revert "Add removeListenerWhileNotifying benchmark for ChangeNotifier (#71986)" (#74450)

This reverts commit 831ee22b.
parent 3c27a567
...@@ -6,177 +6,108 @@ import 'package:flutter/foundation.dart'; ...@@ -6,177 +6,108 @@ import 'package:flutter/foundation.dart';
import '../common.dart'; import '../common.dart';
const int _kNumIterations = 65536; const int _kNumIterations = 1000;
const double _scale = 1000.0 / _kNumIterations;
const int _kNumWarmUp = 100; const int _kNumWarmUp = 100;
const int _kScale = 1000;
void main() { void main() {
assert(false, "Don't run benchmarks in checked mode! Use 'flutter run --release'."); assert(false, "Don't run benchmarks in checked mode! Use 'flutter run --release'.");
// In the following benchmarks, we won't remove the listeners when we don't void listener() {}
// want to measure removeListener because we know that everything will be void listener2() {}
// GC'ed in the end. void listener3() {}
// Not removing listeners would cause memory leaks in a real application. void listener4() {}
void listener5() {}
// Warm up lap
for (int i = 0; i < _kNumWarmUp; i += 1) {
_Notifier()
..addListener(listener)
..addListener(listener2)
..addListener(listener3)
..addListener(listener4)
..addListener(listener5)
..notify()
..removeListener(listener)
..removeListener(listener2)
..removeListener(listener3)
..removeListener(listener4)
..removeListener(listener5);
}
final Stopwatch addListenerWatch = Stopwatch();
final Stopwatch removeListenerWatch = Stopwatch();
final Stopwatch notifyListenersWatch = Stopwatch();
final BenchmarkResultPrinter printer = BenchmarkResultPrinter(); final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
void runAddListenerBenchmark(int iteration, {bool addResult = true}) { for (int listenersCount = 0; listenersCount <= 5; listenersCount++) {
const String name = 'addListener';
for (int listenerCount = 1; listenerCount <= 5; listenerCount += 1) {
final List<_Notifier> notifiers = List<_Notifier>.generate(
iteration,
(_) => _Notifier(),
growable: false,
);
final Stopwatch watch = Stopwatch();
watch.start();
for (int i = 0; i < iteration; i += 1) {
for (int l = 0; l < listenerCount; l += 1) {
notifiers[i].addListener(() {});
}
}
watch.stop();
final int elapsed = watch.elapsedMicroseconds;
final double averagePerIteration = elapsed / iteration;
if (addResult)
printer.addResult(
description: '$name ($listenerCount listeners)',
value: averagePerIteration * _kScale,
unit: 'ns per iteration',
name: '$name${listenerCount}_iteration',
);
}
}
void runNotifyListenerBenchmark(int iteration, {bool addResult = true}) {
const String name = 'notifyListener';
for (int listenerCount = 0; listenerCount <= 5; listenerCount += 1) { for (int j = 0; j < _kNumIterations; j += 1) {
final _Notifier notifier = _Notifier(); final _Notifier notifier = _Notifier();
for (int i = 1; i <= listenerCount; i += 1) { addListenerWatch.start();
notifier.addListener(() {});
} notifier.addListener(listener);
final Stopwatch watch = Stopwatch(); if (listenersCount > 1)
watch.start(); notifier.addListener(listener2);
for (int i = 0; i < iteration; i += 1) { if (listenersCount > 2)
notifier.notify(); notifier.addListener(listener3);
} if (listenersCount > 3)
watch.stop(); notifier.addListener(listener4);
final int elapsed = watch.elapsedMicroseconds; if (listenersCount > 4)
final double averagePerIteration = elapsed / iteration; notifier.addListener(listener5);
if (addResult)
printer.addResult( addListenerWatch.stop();
description: '$name ($listenerCount listeners)', notifyListenersWatch.start();
value: averagePerIteration * _kScale,
unit: 'ns per iteration', notifier.notify();
name: '$name${listenerCount}_iteration',
); notifyListenersWatch.stop();
removeListenerWatch.start();
// Remove listeners in reverse order to evaluate the worse-case scenario:
// the listener removed is the last listener
if (listenersCount > 4)
notifier.removeListener(listener5);
if (listenersCount > 3)
notifier.removeListener(listener4);
if (listenersCount > 2)
notifier.removeListener(listener3);
if (listenersCount > 1)
notifier.removeListener(listener2);
notifier.removeListener(listener);
removeListenerWatch.stop();
} }
}
void runRemoveListenerBenchmark(int iteration, {bool addResult = true}) { final int notifyListener = notifyListenersWatch.elapsedMicroseconds;
const String name = 'removeListener'; notifyListenersWatch.reset();
final List<VoidCallback> listeners = <VoidCallback>[ final int addListenerElapsed = addListenerWatch.elapsedMicroseconds;
() {}, addListenerWatch.reset();
() {}, final int removeListenerElapsed = removeListenerWatch.elapsedMicroseconds;
() {}, removeListenerWatch.reset();
() {},
() {}, printer.addResult(
]; description: 'addListener ($listenersCount listeners)',
for (int listenerCount = 1; listenerCount <= 5; listenerCount += 1) { value: addListenerElapsed * _scale,
final List<_Notifier> notifiers = List<_Notifier>.generate( unit: 'ns per iteration',
iteration, name: 'addListener${listenersCount}_iteration',
(_) { );
final _Notifier notifier = _Notifier();
for (int l = 0; l < listenerCount; l += 1) { printer.addResult(
notifier.addListener(listeners[l]); description: 'removeListener ($listenersCount listeners)',
} value: removeListenerElapsed * _scale,
return notifier; unit: 'ns per iteration',
}, name: 'removeListener${listenersCount}_iteration',
growable: false, );
);
printer.addResult(
final Stopwatch watch = Stopwatch(); description: 'notifyListener ($listenersCount listeners)',
watch.start(); value: notifyListener * _scale,
for (int i = 0; i < iteration; i += 1) { unit: 'ns per iteration',
for (int l = 0; l < listenerCount; l += 1) { name: 'notifyListener${listenersCount}_iteration',
notifiers[i].removeListener(listeners[l]); );
}
}
watch.stop();
final int elapsed = watch.elapsedMicroseconds;
final double averagePerIteration = elapsed / iteration;
if (addResult)
printer.addResult(
description: '$name ($listenerCount listeners)',
value: averagePerIteration * _kScale,
unit: 'ns per iteration',
name: '$name${listenerCount}_iteration',
);
}
} }
void runRemoveListenerWhileNotifyingBenchmark(int iteration, {bool addResult = true}) {
const String name = 'removeListenerWhileNotifying';
final List<VoidCallback> listeners = <VoidCallback>[
() {},
() {},
() {},
() {},
() {},
];
for (int listenerCount = 1; listenerCount <= 5; listenerCount += 1) {
final List<_Notifier> notifiers = List<_Notifier>.generate(
iteration,
(_) {
final _Notifier notifier = _Notifier();
notifier.addListener(() {
// This listener will remove all other listeners. So that only this
// one is called and measured.
for (int l = 0; l < listenerCount; l += 1) {
notifier.removeListener(listeners[l]);
}
});
for (int l = 0; l < listenerCount; l += 1) {
notifier.addListener(listeners[l]);
}
return notifier;
},
growable: false,
);
final Stopwatch watch = Stopwatch();
watch.start();
for (int i = 0; i < iteration; i += 1) {
notifiers[i].notify();
}
watch.stop();
final int elapsed = watch.elapsedMicroseconds;
final double averagePerIteration = elapsed / iteration;
if (addResult)
printer.addResult(
description: '$name ($listenerCount listeners)',
value: averagePerIteration * _kScale,
unit: 'ns per iteration',
name: '$name${listenerCount}_iteration',
);
}
}
runAddListenerBenchmark(_kNumWarmUp, addResult: false);
runAddListenerBenchmark(_kNumIterations, addResult: true);
runNotifyListenerBenchmark(_kNumWarmUp, addResult: false);
runNotifyListenerBenchmark(_kNumIterations, addResult: true);
runRemoveListenerBenchmark(_kNumWarmUp, addResult: false);
runRemoveListenerBenchmark(_kNumIterations, addResult: true);
runRemoveListenerWhileNotifyingBenchmark(_kNumWarmUp, addResult: false);
runRemoveListenerWhileNotifyingBenchmark(_kNumIterations, addResult: true);
printer.printToStdout(); printer.printToStdout();
} }
......
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