Skip to content

Instantly share code, notes, and snippets.

@MelbourneDeveloper
Last active August 9, 2023 16:29
Show Gist options
  • Save MelbourneDeveloper/e35ad5003c866f5cf6ffe812bd8b1905 to your computer and use it in GitHub Desktop.
Save MelbourneDeveloper/e35ad5003c866f5cf6ffe812bd8b1905 to your computer and use it in GitHub Desktop.
Flutter/Dart Benchmarks: ChangeNotifier/Cubit/StateNotifier/StreamController
Test Time (Microseconds)
ValueNotifier 0.14619362615225495
StateNotifier 0.6242255
Cubit 1.2855485
StreamController 1.3412715

macOS Mac Mini - 3.2 GHz 6-Core Intel Core i7, running under Flutter Release Mode

These benchmarks attempt to compare performance of different versions of the observer pattern in Flutter. Each test emits a single value on each call and the listener uses the value to make a simple assignment call.

Disclaimer: no claims are made about the correctness of the comparisons. Please post any corrections or other feedback here.

import 'package:benchmark_harness/benchmark_harness.dart';
import 'package:bloc/bloc.dart';
String counterMirror = '0';
StringCubit controller = StringCubit('0');
class StringCubit extends Cubit<String> {
int counter = 0;
StringCubit(super.state);
void go() {
//Note: this is not the normal use of Cubit but necessary
//for compatibility with the other tests
counter++;
emit(counter.toString());
}
}
class TemplateBenchmark extends BenchmarkBase {
const TemplateBenchmark() : super('Template');
static void main() {
const TemplateBenchmark().report();
}
@override
void run() {
controller.go();
}
@override
void setup() => controller.stream.listen((state) => counterMirror = state);
@override
void teardown() {}
}
void main(List<String> arguments) {
TemplateBenchmark.main();
}
import 'package:benchmark_harness/benchmark_harness.dart';
import 'package:state_notifier/state_notifier.dart';
int counter = 0;
String counterMirror = '0';
StringStateNotifier controller = StringStateNotifier('Hi');
class StringStateNotifier extends StateNotifier<String> {
StringStateNotifier(super.state);
void go() {
counter++;
state = counter.toString();
}
}
class TemplateBenchmark extends BenchmarkBase {
const TemplateBenchmark() : super('Template');
static void main() {
const TemplateBenchmark().report();
}
@override
void run() {
controller.go();
}
@override
void setup() => controller.addListener((state) => counterMirror = state);
@override
void teardown() {}
}
void main(List<String> arguments) {
TemplateBenchmark.main();
}
import 'dart:async';
import 'package:benchmark_harness/benchmark_harness.dart';
String counterMirror = '0';
StringStreamWrapper controller = StringStreamWrapper();
class StringStreamWrapper {
int counter = 0;
StreamController<String> streamController = StreamController();
void go() {
counter++;
streamController.add(counter.toString());
}
}
class TemplateBenchmark extends BenchmarkBase {
const TemplateBenchmark() : super('Template');
static void main() {
const TemplateBenchmark().report();
}
@override
void run() {
controller.go();
}
@override
void setup() => controller.streamController.stream
.listen((state) => counterMirror = state);
@override
void teardown() {}
}
void main(List<String> arguments) {
TemplateBenchmark.main();
}
import 'package:benchmark_harness/benchmark_harness.dart';
import 'package:flutter/material.dart';
String counterMirror = '0';
StringValueNotifier controller = StringValueNotifier('0');
class StringValueNotifier extends ValueNotifier<String> {
int counter = 0;
StringValueNotifier(super.state);
void go() {
counter++;
notifyListeners();
}
}
class TemplateBenchmark extends BenchmarkBase {
const TemplateBenchmark() : super('Template');
static void main() {
const TemplateBenchmark().report();
}
@override
void run() {
controller.go();
}
@override
void setup() =>
controller.addListener(() => counterMirror = controller.value);
@override
void teardown() {}
}
void main(List<String> arguments) {
TemplateBenchmark.main();
}

async 2.9.0 (2.10.0 available) benchmark_harness 2.2.0 bloc 8.1.0 boolean_selector 2.1.0 (2.1.1 available) characters 1.2.1 clock 1.1.1 collection 1.16.0 (1.17.0 available) cupertino_icons 1.0.5 fake_async 1.3.1 flutter 0.0.0 from sdk flutter flutter_lints 2.0.1 flutter_test 0.0.0 from sdk flutter lints 2.0.1 matcher 0.12.12 (0.12.13 available) material_color_utilities 0.1.5 (0.2.0 available) meta 1.8.0 path 1.8.2 sky_engine 0.0.99 from sdk flutter source_span 1.9.0 (1.9.1 available) stack_trace 1.10.0 (1.11.0 available) state_notifier 0.7.2+1 stream_channel 2.1.0 (2.1.1 available) string_scanner 1.1.1 (1.2.0 available) term_glyph 1.2.1 test_api 0.4.12 (0.4.16 available) vector_math 2.1.2 (2.1.4 available)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment