The test that blows my brain.
AOT mode.
In JIT mode, everything is not very good either.
Nightmare.
I can imagine how this can slow down the execution of asynchronous operations.
The same simple operation.
Time passed: 23.366, Test 'good': 9.205 ms
Time passed: 23.376, Test 'bad': 223.224 ms
Time passed: 23.599, Test 'ugly': 782.464 ms
Time passed: 24.382, Test 'good': 9.086 ms
Time passed: 24.392, Test 'bad': 221.495 ms
Time passed: 24.614, Test 'ugly': 785.416 ms
Time passed: 25.400, Test 'good': 9.022 ms
Time passed: 25.409, Test 'bad': 220.241 ms
Time passed: 25.630, Test 'ugly': 785.412 ms
Time passed: 26.416, Test 'good': 9.093 ms
Time passed: 26.425, Test 'bad': 221.584 ms
Time passed: 26.647, Test 'ugly': 789.252 ms
Time passed: 27.437, Test 'good': 9.0 ms
Time passed: 27.446, Test 'bad': 220.065 ms
Time passed: 27.666, Test 'ugly': 784.87 ms
Time passed: 28.452, Test 'good': 9.215 ms
Time passed: 28.461, Test 'bad': 220.894 ms
Time passed: 28.682, Test 'ugly': 784.547 ms
Time passed: 29.467, Test 'good': 9.063 ms
Time passed: 29.477, Test 'bad': 221.141 ms
void main() {
final count = 10000000;
final names = ['good', 'bad', 'ugly'];
final tests = [_test1, _test2, _test3];
final sw = Stopwatch();
var repeat = 150;
sw.start();
while (repeat-- > 0) {
for (var i = 0; i < tests.length; i++) {
final name = names[i];
final test = tests[i];
final seconds = (sw.elapsedMilliseconds / 1000).toStringAsFixed(3);
final title = 'Time passed: $seconds, Test \'$name\'';
_measure(title, 1, () => test(count));
}
}
}
void _measure(String name, int count, Function() f) {
final sw = Stopwatch();
sw.start();
for (var i = 0; i < count; i++) {
f();
}
sw.stop();
final time = sw.elapsedMicroseconds / 1000;
print('$name: $time ms');
}
void _test1(int count) {
final p1 = P1<int>(T1(0));
for (var i = 0; i < count; i++) {
p1.foo(0);
p1.foo(0);
p1.foo(0);
p1.foo(0);
p1.foo(0);
p1.foo(0);
p1.foo(0);
p1.foo(0);
p1.foo(0);
p1.foo(0);
}
}
void _test2(int count) {
final p2 = P2<int>((x) => x == 0);
for (var i = 0; i < count; i++) {
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
}
}
void _test3(int count) {
final p2 = P2<int>(isX);
for (var i = 0; i < count; i++) {
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
p2.foo(0);
}
}
bool isX<T>(T x) => x == 0;
class P1<T> {
final T1<T> t;
P1(this.t);
bool foo(T x) => t.f(x);
}
class P2<T> {
bool Function(T) f;
P2(this.f);
bool foo(T x) => f(x);
}
class T1<T> {
final x;
T1(this.x);
bool f(T x) => this.x == x;
}