@@ -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+
68254void 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