Skip to content

Instantly share code, notes, and snippets.

@Luckey-Elijah
Last active January 9, 2023 16:58
Show Gist options
  • Save Luckey-Elijah/5f1d39e4f739ebbc1270e2e4c822db42 to your computer and use it in GitHub Desktop.
Save Luckey-Elijah/5f1d39e4f739ebbc1270e2e4c822db42 to your computer and use it in GitHub Desktop.
Dart Loop Benchmarking
// Adding this line so we can perform the variable assignment: num eachElement = 0;
// ignore_for_file: unused_local_variable
import 'dart:collection';
import 'dart:math';
void main(List<String> args) {
final list = UnmodifiableListView(
List<int>.generate(200000000, (index) => index),
);
final results = {
'While-Loop Uncached Length':
benchmarck(() => whileLoopUncachedLength(list)),
'While-Loop Cached Length': benchmarck(() => whileLoopCachedLength(list)),
'While-Loop Reversed': benchmarck(() => whileLoopReversed(list)),
'For-Loop Uncached Length': benchmarck(() => forLoopUncachedLength(list)),
'For-Loop Cached Length': benchmarck(() => forLoopCachedLength(list)),
'For Loop Reversed': benchmarck(() => forLoopReversed(list)),
'For-In Loop': benchmarck(() => forInLoop(list)),
'For-Each Loop': benchmarck(() => forEachLoop(list)),
};
final elements = results.entries.toList()
..sort((a, b) => a.value > b.value ? -1 : 1);
print('ms\tLoop');
for (var entry in elements) {
print('${entry.value}\t${entry.key}');
}
}
int benchmarck(void Function() function) {
final stopwatch = Stopwatch()..start();
function();
stopwatch.stop();
return stopwatch.elapsedMilliseconds;
}
void whileLoopUncachedLength(List<int> list) {
var count = 0;
num eachElement = 0;
while (count < list.length) {
eachElement = pow(list[count], 3);
count++;
}
}
void whileLoopCachedLength(List<int> list) {
var count = 0;
num eachElement = 0;
final length = list.length;
while (count < length) {
eachElement = pow(list[count], 3);
count++;
}
}
void whileLoopReversed(List<int> list) {
var count = list.length - 1;
num eachElement = 0;
while (count >= 0) {
eachElement = pow(list[count], 3);
count--;
}
}
void forLoopUncachedLength(List<int> list) {
num eachElement = 0;
for (var i = 0; i < list.length; i++) {
eachElement = pow(list[i], 3);
}
}
void forLoopCachedLength(List<int> list) {
num eachElement = 0;
var length = list.length;
for (var i = 0; i < length; i++) {
eachElement = pow(list[i], 3);
}
}
void forLoopReversed(List<int> list) {
num eachElement = 0;
for (var i = list.length - 1; i >= 0; i--) {
eachElement = pow(list[i], 3);
}
}
void forInLoop(List<int> list) {
num eachElement = 0;
for (var element in list) {
eachElement = pow(element, 3);
}
}
void forEachLoop(List<int> list) {
num eachElement = 0;
void fn(int element) => eachElement = pow(element, 3);
list.forEach(fn);
}

Loop Benchmarks

The loops that are tested itereate over a list with 200,000,000 elements. The value at each index is the index itself.

dart --version
Dart SDK version: 2.18.6 (stable) (Tue Dec 13 21:15:14 2022 +0000) on "macos_x64"

dart run main.dart

ms Loop
1013 For-Each Loop
543 For-In Loop
256 For Loop Reversed
254 For-Loop Cached Length
254 While-Loop Reversed
254 While-Loop Cached Length
202 For-Loop Uncached Length
198 While-Loop Uncached Length

dart compile aot-snapshot main.dart && dartaotruntime main.aot

ms Loop
1199 For-In Loop
981 For-Each Loop
148 For Loop Reversed
148 While-Loop Uncached Length
147 While-Loop Cached Length
146 While-Loop Reversed
145 For-Loop Cached Length
144 For-Loop Uncached Length

dart compile exe main.dart && ./main.exe

ms Loop
1234 For-In Loop
966 For-Each Loop
161 For Loop Reversed
161 While-Loop Reversed
158 For-Loop Uncached Length
157 While-Loop Cached Length
156 For-Loop Cached Length
152 While-Loop Uncached Length

dart compile jit-snapshot main.dart

ms Loop
1136 For-Each Loop
599 For-In Loop
264 For Loop Reversed
257 While-Loop Reversed
254 For-Loop Cached Length
253 While-Loop Cached Length
206 While-Loop Uncached Length
203 For-Loop Uncached Length

dart compile kernel main.dart && dart run ./main.dill

ms Loop
989 For-Each Loop
589 For-In Loop
254 For Loop Reversed
254 While-Loop Reversed
253 For-Loop Cached Length
251 While-Loop Cached Length
203 While-Loop Uncached Length
202 For-Loop Uncached Length
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment