Skip to content

Commit 42e3a7a

Browse files
osa1Commit Queue
authored andcommitted
[dart2wasm] Add more JS interop benchmarks
In prep for [1], benchmark `dartify` performance when converting JS call return values to Dart values. [1]: https://dart-review.googlesource.com/c/sdk/+/424021 Change-Id: I43549276f0ccdfefcc689c0574f82cad4a856aa5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/424940 Commit-Queue: Ömer Ağacan <[email protected]> Reviewed-by: Martin Kustermann <[email protected]>
1 parent a2b2751 commit 42e3a7a

File tree

1 file changed

+254
-0
lines changed

1 file changed

+254
-0
lines changed

benchmarks/WasmJSInterop/WasmJSInterop.dart

Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,213 @@ class DoublePassingBenchmark {
6565
calls;
6666
}
6767

68+
@JS()
69+
external bool dartifyBool();
70+
71+
@JS()
72+
external bool? dartifyNullableBool();
73+
74+
@JS()
75+
external num dartifyNum();
76+
77+
@JS()
78+
external num? dartifyNullableNum();
79+
80+
@JS()
81+
external double dartifyDouble();
82+
83+
@JS()
84+
external double? dartifyNullableDouble();
85+
86+
@JS()
87+
external int dartifyInt();
88+
89+
@JS()
90+
external int? dartifyNullableInt();
91+
92+
@JS()
93+
external String dartifyString();
94+
95+
@JS()
96+
external String? dartifyNullableString();
97+
98+
@JS()
99+
external JSArray dartifyJSArray();
100+
101+
@JS()
102+
external JSArray? dartifyNullableJSArray();
103+
104+
// `dart:typed_data` types are all boxed the same way, so no need to test each
105+
// one of them separately.
106+
@JS()
107+
external JSUint8Array dartifyJSUint8Array();
108+
109+
@JS()
110+
external JSUint8Array? dartifyNullableJSUint8Array();
111+
112+
const int ITERATIONS = 10000;
113+
114+
bool boolSink = false;
115+
116+
double dartifyBoolBenchmark() =>
117+
BenchmarkBase.measureFor(() {
118+
for (int i = 0; i < ITERATIONS; i += 1) {
119+
boolSink = dartifyBool();
120+
}
121+
}, minimumMeasureDurationMillis) /
122+
ITERATIONS;
123+
124+
bool? nullableBoolSink = null;
125+
126+
double dartifyNullableBoolBenchmark() =>
127+
BenchmarkBase.measureFor(() {
128+
for (int i = 0; i < ITERATIONS; i += 1) {
129+
nullableBoolSink = dartifyNullableBool();
130+
}
131+
}, minimumMeasureDurationMillis) /
132+
ITERATIONS;
133+
134+
num numSink = 1;
135+
136+
double dartifyNumBenchmark() =>
137+
BenchmarkBase.measureFor(() {
138+
for (int i = 0; i < ITERATIONS; i += 1) {
139+
numSink = dartifyNum();
140+
}
141+
}, minimumMeasureDurationMillis) /
142+
ITERATIONS;
143+
144+
num? nullableNumSink = null;
145+
146+
double dartifyNullableNumBenchmark() =>
147+
BenchmarkBase.measureFor(() {
148+
for (int i = 0; i < ITERATIONS; i += 1) {
149+
nullableNumSink = dartifyNullableNum();
150+
}
151+
}, minimumMeasureDurationMillis) /
152+
ITERATIONS;
153+
154+
double doubleSink = 0.0;
155+
156+
double dartifyDoubleBenchmark() =>
157+
BenchmarkBase.measureFor(() {
158+
for (int i = 0; i < ITERATIONS; i += 1) {
159+
doubleSink = dartifyDouble();
160+
}
161+
}, minimumMeasureDurationMillis) /
162+
ITERATIONS;
163+
164+
double? nullableDoubleSink = null;
165+
166+
double dartifyNullableDoubleBenchmark() =>
167+
BenchmarkBase.measureFor(() {
168+
for (int i = 0; i < ITERATIONS; i += 1) {
169+
nullableDoubleSink = dartifyNullableDouble();
170+
}
171+
}, minimumMeasureDurationMillis) /
172+
ITERATIONS;
173+
174+
int intSink = 0;
175+
176+
double dartifyIntBenchmark() =>
177+
BenchmarkBase.measureFor(() {
178+
for (int i = 0; i < ITERATIONS; i += 1) {
179+
intSink = dartifyInt();
180+
}
181+
}, minimumMeasureDurationMillis) /
182+
ITERATIONS;
183+
184+
int? nullableIntSink = null;
185+
186+
double dartifyNullableIntBenchmark() =>
187+
BenchmarkBase.measureFor(() {
188+
for (int i = 0; i < ITERATIONS; i += 1) {
189+
nullableIntSink = dartifyNullableInt();
190+
}
191+
}, minimumMeasureDurationMillis) /
192+
ITERATIONS;
193+
194+
String stringSink = "";
195+
196+
double dartifyStringBenchmark() =>
197+
BenchmarkBase.measureFor(() {
198+
for (int i = 0; i < ITERATIONS; i += 1) {
199+
stringSink = dartifyString();
200+
}
201+
}, minimumMeasureDurationMillis) /
202+
ITERATIONS;
203+
204+
String? nullableStringSink = null;
205+
206+
double dartifyNullableStringBenchmark() =>
207+
BenchmarkBase.measureFor(() {
208+
for (int i = 0; i < ITERATIONS; i += 1) {
209+
nullableStringSink = dartifyNullableString();
210+
}
211+
}, minimumMeasureDurationMillis) /
212+
ITERATIONS;
213+
214+
JSArray jsArraySink = JSArray();
215+
216+
double dartifyJSArrayBenchmark() =>
217+
BenchmarkBase.measureFor(() {
218+
for (int i = 0; i < ITERATIONS; i += 1) {
219+
jsArraySink = dartifyJSArray();
220+
}
221+
}, minimumMeasureDurationMillis) /
222+
ITERATIONS;
223+
224+
JSArray? nullableJsArraySink = null;
225+
226+
double dartifyNullableJSArrayBenchmark() =>
227+
BenchmarkBase.measureFor(() {
228+
for (int i = 0; i < ITERATIONS; i += 1) {
229+
nullableJsArraySink = dartifyNullableJSArray();
230+
}
231+
}, minimumMeasureDurationMillis) /
232+
ITERATIONS;
233+
234+
JSUint8Array jsUint8ArraySink = JSUint8Array();
235+
236+
double dartifyJSUint8ArrayBenchmark() =>
237+
BenchmarkBase.measureFor(() {
238+
for (int i = 0; i < ITERATIONS; i += 1) {
239+
jsUint8ArraySink = dartifyJSUint8Array();
240+
}
241+
}, minimumMeasureDurationMillis) /
242+
ITERATIONS;
243+
244+
JSUint8Array? nullableJsUint8ArraySink = null;
245+
246+
double dartifyNullableJSUint8ArrayBenchmark() =>
247+
BenchmarkBase.measureFor(() {
248+
for (int i = 0; i < ITERATIONS; i += 1) {
249+
nullableJsUint8ArraySink = dartifyNullableJSUint8Array();
250+
}
251+
}, minimumMeasureDurationMillis) /
252+
ITERATIONS;
253+
68254
void main() {
69255
eval('''
70256
self.intFun = (i) => i;
71257
self.doubleFun = (d) => d;
258+
self.dartifyBool = () => true;
259+
self.dartifyNullableBool = () => false;
260+
self.dartifyNum = () => 12.34;
261+
self.dartifyNullableNum = () => 56.78;
262+
self.dartifyDouble = () => 10.20;
263+
self.dartifyNullableDouble = () => 30.40;
264+
self.dartifyInt = () => 123;
265+
self.dartifyNullableInt = () => 456;
266+
self.dartifyString = () => "abc";
267+
self.dartifyNullableString = () => "def";
268+
269+
// Arrays are all empty to not add element conversion overheads to the
270+
// benchmark results.
271+
self.dartifyJSArray = () => new Array();
272+
self.dartifyNullableJSArray = () => new Array();
273+
self.dartifyJSUint8Array = () => new Uint8Array(0);
274+
self.dartifyNullableJSUint8Array = () => new Uint8Array(0);
72275
''');
73276

74277
final maxI31 = (1 << 30) - 1;
@@ -84,6 +287,57 @@ void main() {
84287
DoublePassingBenchmark(1.0, 1.0, 10).measure();
85288
final double = DoublePassingBenchmark(1.0, 12.34, 1000000).measure();
86289
report('WasmJSInterop.call.void.1ArgsDouble', double);
290+
291+
report('WasmJSInterop.call.bool.0Args', dartifyBoolBenchmark());
292+
report(
293+
'WasmJSInterop.call.nullableBool.0Args',
294+
dartifyNullableBoolBenchmark(),
295+
);
296+
report('WasmJSInterop.call.num.0Args', dartifyNumBenchmark());
297+
report('WasmJSInterop.call.nullableNum.0Args', dartifyNullableNumBenchmark());
298+
report('WasmJSInterop.call.double.0Args', dartifyDoubleBenchmark());
299+
report(
300+
'WasmJSInterop.call.nullableDouble.0Args',
301+
dartifyNullableDoubleBenchmark(),
302+
);
303+
report('WasmJSInterop.call.int.0Args', dartifyIntBenchmark());
304+
report('WasmJSInterop.call.nullableInt.0Args', dartifyNullableIntBenchmark());
305+
report('WasmJSInterop.call.string.0Args', dartifyStringBenchmark());
306+
report(
307+
'WasmJSInterop.call.nullableString.0Args',
308+
dartifyNullableStringBenchmark(),
309+
);
310+
report('WasmJSInterop.call.JSArray.0Args', dartifyJSArrayBenchmark());
311+
report(
312+
'WasmJSInterop.call.nullableJSArray.0Args',
313+
dartifyNullableJSArrayBenchmark(),
314+
);
315+
report(
316+
'WasmJSInterop.call.JSUint8Array.0Args',
317+
dartifyJSUint8ArrayBenchmark(),
318+
);
319+
report(
320+
'WasmJSInterop.call.nullableJSUint8Array.0Args',
321+
dartifyNullableJSUint8ArrayBenchmark(),
322+
);
323+
324+
// To keep the sinks alive
325+
if (int.parse('1') == 0) {
326+
print(boolSink);
327+
print(nullableBoolSink);
328+
print(numSink);
329+
print(nullableNumSink);
330+
print(doubleSink);
331+
print(nullableDoubleSink);
332+
print(intSink);
333+
print(nullableIntSink);
334+
print(stringSink);
335+
print(nullableStringSink);
336+
print(jsArraySink);
337+
print(nullableJsArraySink);
338+
print(jsUint8ArraySink);
339+
print(nullableJsUint8ArraySink);
340+
}
87341
}
88342

89343
/// Reports in Golem-specific format.

0 commit comments

Comments
 (0)