Skip to content

Commit af1b5b8

Browse files
mkustermannCommit Queue
authored and
Commit Queue
committed
[dart2wasm] Switch binaryen optimization levels from -O3 to -Os
We want dart2wasm be comparable to dart2js / dart2aot, the ladder two are much more conservative with inlining compared to current dart2wasm. The -O3 is described in the binaryen sources as agressive for performance and therefore willing to compromise code size. The -Os is more nuanced: It will perform many optimizations that are done in -O3 (and e.g. not in -O2) but it will make inlining less agressive. This reduces flute compile-time by 10% and code size by 10% This benchmark results are mixed (some things get faster, some things slower). Naturally there'll be specialized micro benchmarks that get hit hard by this. Where performance matters we should rather make dart2wasm use better inlining heuristics and annotate code with `@pragma('wasm:prefer-inline')` Change-Id: Idf7e75e4e385629c9cec66359efe0afe50db3e72 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/352523 Reviewed-by: Slava Egorov <[email protected]> Commit-Queue: Martin Kustermann <[email protected]>
1 parent 2f0bbd9 commit af1b5b8

File tree

14 files changed

+121
-3
lines changed

14 files changed

+121
-3
lines changed

benchmarks/AsyncLiveVars/dart/AsyncLiveVars.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,33 @@ class MockClass {
1515
List<int>.filled(int.parse('3'), int.parse('42'));
1616

1717
@pragma('vm:never-inline')
18+
@pragma('wasm:never-inline')
1819
@pragma('dart2js:noInline')
1920
String get1() => str;
2021

2122
@pragma('vm:never-inline')
23+
@pragma('wasm:never-inline')
2224
@pragma('dart2js:noInline')
2325
List<int> get2() => list;
2426

2527
@pragma('vm:never-inline')
28+
@pragma('wasm:never-inline')
2629
@pragma('dart2js:noInline')
2730
void use1(String a0) => a0.length;
2831

2932
@pragma('vm:never-inline')
33+
@pragma('wasm:never-inline')
3034
@pragma('dart2js:noInline')
3135
void use2(String a0, List<int> a1) => a0.length + a1.length;
3236

3337
@pragma('vm:never-inline')
38+
@pragma('wasm:never-inline')
3439
@pragma('dart2js:noInline')
3540
void use4(String a0, List<int> a1, String a2, List<int> a3) =>
3641
a0.length + a1.length + a2.length + a3.length;
3742

3843
@pragma('vm:never-inline')
44+
@pragma('wasm:never-inline')
3945
@pragma('dart2js:noInline')
4046
void use8(String a0, List<int> a1, String a2, List<int> a3, String a4,
4147
List<int> a5, String a6, List<int> a7) =>
@@ -49,6 +55,7 @@ class MockClass {
4955
a7.length;
5056

5157
@pragma('vm:never-inline')
58+
@pragma('wasm:never-inline')
5259
@pragma('dart2js:noInline')
5360
Future<void> asyncMethod() async {}
5461
}
@@ -58,26 +65,32 @@ class MockClass2 {
5865
static int val2 = int.parse('43');
5966

6067
@pragma('vm:never-inline')
68+
@pragma('wasm:never-inline')
6169
@pragma('dart2js:noInline')
6270
int get1() => val1;
6371

6472
@pragma('vm:never-inline')
73+
@pragma('wasm:never-inline')
6574
@pragma('dart2js:noInline')
6675
int get2() => val2;
6776

6877
@pragma('vm:never-inline')
78+
@pragma('wasm:never-inline')
6979
@pragma('dart2js:noInline')
7080
void use1(int a0) => a0;
7181

7282
@pragma('vm:never-inline')
83+
@pragma('wasm:never-inline')
7384
@pragma('dart2js:noInline')
7485
void use2(int a0, int a1) => a0 + a1;
7586

7687
@pragma('vm:never-inline')
88+
@pragma('wasm:never-inline')
7789
@pragma('dart2js:noInline')
7890
void use4(int a0, int a1, int a2, int a3) => a0 + a1 + a2 + a3;
7991

8092
@pragma('vm:never-inline')
93+
@pragma('wasm:never-inline')
8194
@pragma('dart2js:noInline')
8295
Future<void> asyncMethod() async {}
8396
}

benchmarks/Calls/dart/Calls.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ Future main() async {
103103
}
104104

105105
@pragma('vm:never-inline')
106+
@pragma('wasm:never-inline')
106107
@pragma('dart2js:noInline')
107108
Future<int> performAwaitCallsClosureTargetPolymorphic(
108109
FutureOr<int> Function(int) fun) async {
@@ -115,6 +116,7 @@ Future<int> performAwaitCallsClosureTargetPolymorphic(
115116
}
116117

117118
@pragma('vm:never-inline')
119+
@pragma('wasm:never-inline')
118120
@pragma('dart2js:noInline')
119121
Future<int> performAwaitAsyncCallsInstanceTargetPolymorphic(
120122
Target target) async {
@@ -127,6 +129,7 @@ Future<int> performAwaitAsyncCallsInstanceTargetPolymorphic(
127129
}
128130

129131
@pragma('vm:never-inline')
132+
@pragma('wasm:never-inline')
130133
@pragma('dart2js:noInline')
131134
Future<int> performAwaitFutureCallsInstanceTargetPolymorphic(
132135
Target target) async {
@@ -139,6 +142,7 @@ Future<int> performAwaitFutureCallsInstanceTargetPolymorphic(
139142
}
140143

141144
@pragma('vm:never-inline')
145+
@pragma('wasm:never-inline')
142146
@pragma('dart2js:noInline')
143147
Future<int> performAwaitFutureOrCallsInstanceTargetPolymorphic(
144148
Target target) async {
@@ -151,6 +155,7 @@ Future<int> performAwaitFutureOrCallsInstanceTargetPolymorphic(
151155
}
152156

153157
@pragma('vm:never-inline')
158+
@pragma('wasm:never-inline')
154159
@pragma('dart2js:noInline')
155160
Future<int> performAwaitAsyncCalls() async {
156161
int sum = 0;
@@ -162,6 +167,7 @@ Future<int> performAwaitAsyncCalls() async {
162167
}
163168

164169
@pragma('vm:never-inline')
170+
@pragma('wasm:never-inline')
165171
@pragma('dart2js:noInline')
166172
Future<int> performAwaitFutureCalls() async {
167173
int sum = 0;
@@ -173,6 +179,7 @@ Future<int> performAwaitFutureCalls() async {
173179
}
174180

175181
@pragma('vm:never-inline')
182+
@pragma('wasm:never-inline')
176183
@pragma('dart2js:noInline')
177184
Future<int> performAwaitFutureOrCalls() async {
178185
int sum = 0;
@@ -184,6 +191,7 @@ Future<int> performAwaitFutureOrCalls() async {
184191
}
185192

186193
@pragma('vm:never-inline')
194+
@pragma('wasm:never-inline')
187195
@pragma('dart2js:noInline')
188196
Future<int> performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(
189197
Target t) async {
@@ -284,6 +292,7 @@ Future<int> performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(
284292
}
285293

286294
@pragma('vm:never-inline')
295+
@pragma('wasm:never-inline')
287296
@pragma('dart2js:noInline')
288297
Future<int> performAwaitForIterationPolymorphic(
289298
Stream<int> Function(int) fun) async {
@@ -296,6 +305,7 @@ Future<int> performAwaitForIterationPolymorphic(
296305
}
297306

298307
@pragma('vm:never-inline')
308+
@pragma('wasm:never-inline')
299309
@pragma('dart2js:noInline')
300310
int performSyncCallsClosureTarget(int Function(int) fun) {
301311
int sum = 0;
@@ -307,6 +317,7 @@ int performSyncCallsClosureTarget(int Function(int) fun) {
307317
}
308318

309319
@pragma('vm:never-inline')
320+
@pragma('wasm:never-inline')
310321
@pragma('dart2js:noInline')
311322
int performSyncCallsInstanceTargetPolymorphic(Target target) {
312323
int sum = 0;
@@ -318,6 +329,7 @@ int performSyncCallsInstanceTargetPolymorphic(Target target) {
318329
}
319330

320331
@pragma('vm:never-inline')
332+
@pragma('wasm:never-inline')
321333
@pragma('dart2js:noInline')
322334
int performSyncCalls() {
323335
int sum = 0;
@@ -329,6 +341,7 @@ int performSyncCalls() {
329341
}
330342

331343
@pragma('vm:never-inline')
344+
@pragma('wasm:never-inline')
332345
@pragma('dart2js:noInline')
333346
int performSyncIterationPolymorphic(Iterable<int> Function(int) fun) {
334347
int sum = 0;
@@ -340,18 +353,22 @@ int performSyncIterationPolymorphic(Iterable<int> Function(int) fun) {
340353
}
341354

342355
@pragma('vm:never-inline')
356+
@pragma('wasm:never-inline')
343357
@pragma('dart2js:noInline')
344358
FutureOr<int> returnFutureOr(int i) => i;
345359

346360
@pragma('vm:never-inline')
361+
@pragma('wasm:never-inline')
347362
@pragma('dart2js:noInline')
348363
Future<int> returnFuture(int i) => Future.value(i);
349364

350365
@pragma('vm:never-inline')
366+
@pragma('wasm:never-inline')
351367
@pragma('dart2js:noInline')
352368
Future<int> returnAsync(int i) async => i;
353369

354370
@pragma('vm:never-inline')
371+
@pragma('wasm:never-inline')
355372
@pragma('dart2js:noInline')
356373
Stream<int> generateNumbersAsyncStar(int limit) async* {
357374
for (int i = 0; i < limit; ++i) {
@@ -360,6 +377,7 @@ Stream<int> generateNumbersAsyncStar(int limit) async* {
360377
}
361378

362379
@pragma('vm:never-inline')
380+
@pragma('wasm:never-inline')
363381
@pragma('dart2js:noInline')
364382
Stream<int> generateNumbersAsyncStar2(int limit) async* {
365383
for (int i = 0; i < limit; ++i) {
@@ -368,6 +386,7 @@ Stream<int> generateNumbersAsyncStar2(int limit) async* {
368386
}
369387

370388
@pragma('vm:never-inline')
389+
@pragma('wasm:never-inline')
371390
@pragma('dart2js:noInline')
372391
Stream<int> generateNumbersManualAsync(int limit) {
373392
int current = 0;
@@ -395,10 +414,12 @@ Stream<int> generateNumbersManualAsync(int limit) {
395414
}
396415

397416
@pragma('vm:never-inline')
417+
@pragma('wasm:never-inline')
398418
@pragma('dart2js:noInline')
399419
int returnSync(int i) => i;
400420

401421
@pragma('vm:never-inline')
422+
@pragma('wasm:never-inline')
402423
@pragma('dart2js:noInline')
403424
Iterable<int> generateNumbersSyncStar(int limit) sync* {
404425
for (int i = 0; i < limit; ++i) {
@@ -407,6 +428,7 @@ Iterable<int> generateNumbersSyncStar(int limit) sync* {
407428
}
408429

409430
@pragma('vm:never-inline')
431+
@pragma('wasm:never-inline')
410432
@pragma('dart2js:noInline')
411433
Iterable<int> generateNumbersSyncStar2(int limit) sync* {
412434
for (int i = 0; i < limit; ++i) {
@@ -415,11 +437,13 @@ Iterable<int> generateNumbersSyncStar2(int limit) sync* {
415437
}
416438

417439
@pragma('vm:never-inline')
440+
@pragma('wasm:never-inline')
418441
@pragma('dart2js:noInline')
419442
Iterable<int> generateNumbersManual(int limit) =>
420443
Iterable<int>.generate(limit, (int i) => i);
421444

422445
@pragma('vm:never-inline')
446+
@pragma('wasm:never-inline')
423447
@pragma('dart2js:noInline')
424448
Iterable<int> generateNumbersSyncStarManyYields(int limit) sync* {
425449
int i = 0;
@@ -574,6 +598,7 @@ Iterable<int> generateNumbersSyncStarManyYields(int limit) sync* {
574598
}
575599

576600
@pragma('vm:never-inline')
601+
@pragma('wasm:never-inline')
577602
@pragma('dart2js:noInline')
578603
Stream<int> generateNumbersAsyncStarManyYields(int limit) async* {
579604
int i = 0;
@@ -729,62 +754,74 @@ Stream<int> generateNumbersAsyncStarManyYields(int limit) async* {
729754

730755
class Target {
731756
@pragma('vm:never-inline')
757+
@pragma('wasm:never-inline')
732758
@pragma('dart2js:noInline')
733759
FutureOr<int> returnFutureOr(int i) => i;
734760

735761
@pragma('vm:never-inline')
762+
@pragma('wasm:never-inline')
736763
@pragma('dart2js:noInline')
737764
Future<int> returnFuture(int i) => Future.value(i);
738765

739766
@pragma('vm:never-inline')
767+
@pragma('wasm:never-inline')
740768
@pragma('dart2js:noInline')
741769
Future<int> returnAsync(int i) async => i;
742770

743771
@pragma('vm:never-inline')
772+
@pragma('wasm:never-inline')
744773
@pragma('dart2js:noInline')
745774
int returnSync(int i) => i;
746775
}
747776

748777
class Target2 extends Target {
749778
@override
750779
@pragma('vm:never-inline')
780+
@pragma('wasm:never-inline')
751781
@pragma('dart2js:noInline')
752782
FutureOr<int> returnFutureOr(int i) => i;
753783

754784
@override
755785
@pragma('vm:never-inline')
786+
@pragma('wasm:never-inline')
756787
@pragma('dart2js:noInline')
757788
Future<int> returnFuture(int i) => Future.value(i);
758789

759790
@override
760791
@pragma('vm:never-inline')
792+
@pragma('wasm:never-inline')
761793
@pragma('dart2js:noInline')
762794
Future<int> returnAsync(int i) async => i;
763795

764796
@override
765797
@pragma('vm:never-inline')
798+
@pragma('wasm:never-inline')
766799
@pragma('dart2js:noInline')
767800
int returnSync(int i) => i;
768801
}
769802

770803
class Target3 extends Target {
771804
@override
772805
@pragma('vm:never-inline')
806+
@pragma('wasm:never-inline')
773807
@pragma('dart2js:noInline')
774808
FutureOr<int> returnFutureOr(int i) => i;
775809

776810
@override
777811
@pragma('vm:never-inline')
812+
@pragma('wasm:never-inline')
778813
@pragma('dart2js:noInline')
779814
Future<int> returnFuture(int i) => Future.value(i);
780815

781816
@override
782817
@pragma('vm:never-inline')
818+
@pragma('wasm:never-inline')
783819
@pragma('dart2js:noInline')
784820
Future<int> returnAsync(int i) async => i;
785821

786822
@override
787823
@pragma('vm:never-inline')
824+
@pragma('wasm:never-inline')
788825
@pragma('dart2js:noInline')
789826
int returnSync(int i) => i;
790827
}

0 commit comments

Comments
 (0)