Skip to content

Instantly share code, notes, and snippets.

@danielgomezrico
Created January 5, 2024 17:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielgomezrico/506aa4d41a9b753c7bea0f95d7423a0c to your computer and use it in GitHub Desktop.
Save danielgomezrico/506aa4d41a9b753c7bea0f95d7423a0c to your computer and use it in GitHub Desktop.
i18n performance test using i18n.Of, temporal variables and i18n.current

Results are:

With Current

  • direclty access to i18n(RunTime): 55185442.5 us.
  • indireclty access to i18n(RunTime): 55758307.0 us.
  • indireclty outside access to i18n(RunTime): 56177293.5 us.

With BuildContext

  • direclty access to i18n(RunTime): 92459941.0 us.
  • indireclty access to i18n(RunTime): 83667963.5 us.
  • indireclty outside access to i18n(RunTime): 73185154.5 us.

With BuildContext and I18n.of without extension

  • direclty access to i18n(RunTime): 90221982.5 us.
  • indireclty access to i18n(RunTime): 79991600.0 us.
  • indireclty outside access to i18n(RunTime): 70861710.0 us.
  • indireclty outside access without extension to i18n(RunTime): 70502296.5 us.
import 'package:benchmark_harness/benchmark_harness.dart';
import 'package:drivers_app/common/extension/build_context_extension.dart';
import 'package:drivers_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
import 'test_utils/i18n_utils.dart';
extension BuildContextExtensions on BuildContext {
I18n get i18n => I18n.of(this);
}
class Directly extends BenchmarkBase {
const Directly(this.times) : super('direclty access to i18n');
final int times;
@override
void run() {
for (var i = 0; i < times; i++) {
final a = I18n.current.profile;
final b = I18n.current.myLoads;
}
}
}
class Indirectly extends BenchmarkBase {
const Indirectly(this.times) : super('indireclty access to i18n');
final int times;
@override
void run() {
for (var i = 0; i < times; i++) {
final i18n = I18n.current;
final a = i18n.profile;
final b = i18n.myLoads;
}
}
}
class IndirectlyOutside extends BenchmarkBase {
const IndirectlyOutside(this.times)
: super('indireclty outside access to i18n');
final int times;
@override
void run() {
final i18n = I18n.current;
for (var i = 0; i < times; i++) {
final a = i18n.profile;
final b = i18n.myLoads;
}
}
}
class DirectlyWithContext extends BenchmarkBase {
const DirectlyWithContext(this.times, this.context)
: super('direclty access to i18n');
final int times;
final BuildContext context;
@override
void run() {
for (var i = 0; i < times; i++) {
final a = context.i18n.profile;
final b = context.i18n.myLoads;
}
}
}
class IndirectlyWithContext extends BenchmarkBase {
const IndirectlyWithContext(this.times, this.context)
: super('indireclty access to i18n');
final int times;
final BuildContext context;
@override
void run() {
for (var i = 0; i < times; i++) {
final i18n = context.i18n;
final a = i18n.profile;
final b = i18n.myLoads;
}
}
}
class IndirectlyOutsideWithContext extends BenchmarkBase {
const IndirectlyOutsideWithContext(this.times, this.context)
: super('indireclty outside access to i18n');
final int times;
final BuildContext context;
@override
void run() {
final i18n = context.i18n;
for (var i = 0; i < times; i++) {
final a = i18n.profile;
final b = i18n.myLoads;
}
}
}
class IndirectlyOutsideWithoutExtensionWithContext extends BenchmarkBase {
const IndirectlyOutsideWithoutExtensionWithContext(this.times, this.context)
: super('indireclty outside access without extension to i18n');
final int times;
final BuildContext context;
@override
void run() {
final i18n = I18n.of(context);
for (var i = 0; i < times; i++) {
final a = i18n.profile;
final b = i18n.myLoads;
}
}
}
void main() {
const times = 9999999;
setUp(() async {
await i18nLoadLocale();
});
test('measuring', () async {
const Directly(times).report();
const Indirectly(times).report();
const IndirectlyOutside(times).report();
}, skip: true);
testWidgets('measuring with context', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
localizationsDelegates: const [
I18n.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: I18n.delegate.supportedLocales,
home: Builder(
builder: (BuildContext context) {
DirectlyWithContext(times, context).report();
IndirectlyWithContext(times, context).report();
IndirectlyOutsideWithContext(times, context).report();
IndirectlyOutsideWithoutExtensionWithContext(times, context).report();
return Container();
},
),
),
);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment