blob: 3e6f29759c7ed22dc04f7ac869a7b37695724a11 [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// TODO(37581): Generate this file.
// These micro benchmarks track the speed of reading and writing C memory from
// Dart with a specific marshalling and unmarshalling of data.
// @dart=2.9
import 'dart:ffi';
import 'dart:io';
import 'package:ffi/ffi.dart';
import 'package:benchmark_harness/benchmark_harness.dart';
import 'dlopen_helper.dart';
//
// Trampoline functions.
//
DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific('native_functions',
path: Platform.script.resolve('../native/out/').path);
typedef NativeFunction1Uint8 = Uint8 Function(Uint8);
typedef Function1int = int Function(int);
final function1Uint8 = ffiTestFunctions
.lookupFunction<NativeFunction1Uint8, Function1int>('Function1Uint8');
typedef NativeFunction1Uint16 = Uint16 Function(Uint16);
final function1Uint16 = ffiTestFunctions
.lookupFunction<NativeFunction1Uint16, Function1int>('Function1Uint16');
typedef NativeFunction1Uint32 = Uint32 Function(Uint32);
final function1Uint32 = ffiTestFunctions
.lookupFunction<NativeFunction1Uint32, Function1int>('Function1Uint32');
typedef NativeFunction1Uint64 = Uint64 Function(Uint64);
final function1Uint64 = ffiTestFunctions
.lookupFunction<NativeFunction1Uint64, Function1int>('Function1Uint64');
typedef NativeFunction1Int8 = Int8 Function(Int8);
final function1Int8 = ffiTestFunctions
.lookupFunction<NativeFunction1Int8, Function1int>('Function1Int8');
typedef NativeFunction1Int16 = Int16 Function(Int16);
final function1Int16 = ffiTestFunctions
.lookupFunction<NativeFunction1Int16, Function1int>('Function1Int16');
typedef NativeFunction1Int32 = Int32 Function(Int32);
final function1Int32 = ffiTestFunctions
.lookupFunction<NativeFunction1Int32, Function1int>('Function1Int32');
typedef NativeFunction2Int32 = Int32 Function(Int32, Int32);
typedef Function2int = int Function(int, int);
final function2Int32 = ffiTestFunctions
.lookupFunction<NativeFunction2Int32, Function2int>('Function2Int32');
typedef NativeFunction4Int32 = Int32 Function(Int32, Int32, Int32, Int32);
typedef Function4int = int Function(int, int, int, int);
final function4Int32 = ffiTestFunctions
.lookupFunction<NativeFunction4Int32, Function4int>('Function4Int32');
typedef NativeFunction10Int32 = Int32 Function(
Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32);
typedef Function10int = int Function(
int, int, int, int, int, int, int, int, int, int);
final function10Int32 = ffiTestFunctions
.lookupFunction<NativeFunction10Int32, Function10int>('Function10Int32');
typedef NativeFunction20Int32 = Int32 Function(
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32);
typedef Function20int = int Function(int, int, int, int, int, int, int, int,
int, int, int, int, int, int, int, int, int, int, int, int);
final function20Int32 = ffiTestFunctions
.lookupFunction<NativeFunction20Int32, Function20int>('Function20Int32');
typedef NativeFunction1Int64 = Int64 Function(Int64);
final function1Int64 = ffiTestFunctions
.lookupFunction<NativeFunction1Int64, Function1int>('Function1Int64');
typedef NativeFunction2Int64 = Int64 Function(Int64, Int64);
final function2Int64 = ffiTestFunctions
.lookupFunction<NativeFunction2Int64, Function2int>('Function2Int64');
typedef NativeFunction4Int64 = Int64 Function(Int64, Int64, Int64, Int64);
final function4Int64 = ffiTestFunctions
.lookupFunction<NativeFunction4Int64, Function4int>('Function4Int64');
typedef NativeFunction10Int64 = Int64 Function(
Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64);
final function10Int64 = ffiTestFunctions
.lookupFunction<NativeFunction10Int64, Function10int>('Function10Int64');
typedef NativeFunction20Int64 = Int64 Function(
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64,
Int64);
final function20Int64 = ffiTestFunctions
.lookupFunction<NativeFunction20Int64, Function20int>('Function20Int64');
typedef NativeFunction1Float = Float Function(Float);
typedef Function1double = double Function(double);
final function1Float = ffiTestFunctions
.lookupFunction<NativeFunction1Float, Function1double>('Function1Float');
typedef NativeFunction2Float = Float Function(Float, Float);
typedef Function2double = double Function(double, double);
final function2Float = ffiTestFunctions
.lookupFunction<NativeFunction2Float, Function2double>('Function2Float');
typedef NativeFunction4Float = Float Function(Float, Float, Float, Float);
typedef Function4double = double Function(double, double, double, double);
final function4Float = ffiTestFunctions
.lookupFunction<NativeFunction4Float, Function4double>('Function4Float');
typedef NativeFunction10Float = Float Function(
Float, Float, Float, Float, Float, Float, Float, Float, Float, Float);
typedef Function10double = double Function(double, double, double, double,
double, double, double, double, double, double);
final function10Float = ffiTestFunctions
.lookupFunction<NativeFunction10Float, Function10double>('Function10Float');
typedef NativeFunction20Float = Float Function(
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float);
typedef Function20double = double Function(
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double,
double);
final function20Float = ffiTestFunctions
.lookupFunction<NativeFunction20Float, Function20double>('Function20Float');
typedef NativeFunction1Double = Double Function(Double);
final function1Double = ffiTestFunctions
.lookupFunction<NativeFunction1Double, Function1double>('Function1Double');
typedef NativeFunction2Double = Double Function(Double, Double);
final function2Double = ffiTestFunctions
.lookupFunction<NativeFunction2Double, Function2double>('Function1Double');
typedef NativeFunction4Double = Double Function(Double, Double, Double, Double);
final function4Double = ffiTestFunctions
.lookupFunction<NativeFunction4Double, Function4double>('Function1Double');
typedef NativeFunction10Double = Double Function(Double, Double, Double, Double,
Double, Double, Double, Double, Double, Double);
Function10double function10Double =
ffiTestFunctions.lookupFunction<NativeFunction10Double, Function10double>(
'Function10Double');
typedef NativeFunction20Double = Double Function(
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double,
Double);
Function20double function20Double =
ffiTestFunctions.lookupFunction<NativeFunction20Double, Function20double>(
'Function20Double');
typedef Function1PointerUint8 = Pointer<Uint8> Function(Pointer<Uint8>);
final function1PointerUint8 = ffiTestFunctions.lookupFunction<
Function1PointerUint8, Function1PointerUint8>('Function1PointerUint8');
typedef Function2PointerUint8 = Pointer<Uint8> Function(
Pointer<Uint8>, Pointer<Uint8>);
final function2PointerUint8 = ffiTestFunctions.lookupFunction<
Function2PointerUint8, Function2PointerUint8>('Function2PointerUint8');
typedef Function4PointerUint8 = Pointer<Uint8> Function(
Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>);
final function4PointerUint8 = ffiTestFunctions.lookupFunction<
Function4PointerUint8, Function4PointerUint8>('Function4PointerUint8');
typedef Function10PointerUint8 = Pointer<Uint8> Function(
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>);
final function10PointerUint8 = ffiTestFunctions.lookupFunction<
Function10PointerUint8, Function10PointerUint8>('Function10PointerUint8');
typedef Function20PointerUint8 = Pointer<Uint8> Function(
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>,
Pointer<Uint8>);
final function20PointerUint8 = ffiTestFunctions.lookupFunction<
Function20PointerUint8, Function20PointerUint8>('Function20PointerUint8');
final function1handle = ffiTestFunctions.lookupFunction<Handle Function(Handle),
Object Function(Object)>('Function1Handle');
final function2handle = ffiTestFunctions.lookupFunction<
Handle Function(Handle, Handle),
Object Function(Object, Object)>('Function2Handle');
final function4handle = ffiTestFunctions.lookupFunction<
Handle Function(Handle, Handle, Handle, Handle),
Object Function(Object, Object, Object, Object)>('Function4Handle');
final function10handle = ffiTestFunctions.lookupFunction<
Handle Function(Handle, Handle, Handle, Handle, Handle, Handle, Handle,
Handle, Handle, Handle),
Object Function(Object, Object, Object, Object, Object, Object, Object,
Object, Object, Object)>('Function10Handle');
final function20handle = ffiTestFunctions.lookupFunction<
Handle Function(
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle,
Handle),
Object Function(
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object,
Object)>('Function20Handle');
//
// Trampoline call.
//
int doCall1Uint8(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Uint8(17);
}
return x;
}
int doCall1Uint16(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Uint16(17);
}
return x;
}
int doCall1Uint32(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Uint32(i);
}
return x;
}
int doCall1Uint64(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Uint64(i);
}
return x;
}
int doCall1Int8(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Int8(17);
}
return x;
}
int doCall1Int16(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Int16(17);
}
return x;
}
int doCall1Int32(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Int32(i);
}
return x;
}
int doCall2Int32(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function2Int32(i, i);
}
return x;
}
int doCall4Int32(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function4Int32(i, i, i, i);
}
return x;
}
int doCall10Int32(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function10Int32(i, i, i, i, i, i, i, i, i, i);
}
return x;
}
int doCall20Int32(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function20Int32(
i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
}
return x;
}
int doCall1Int64(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function1Int64(i);
}
return x;
}
int doCall2Int64(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function2Int64(i, i);
}
return x;
}
int doCall4Int64(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function4Int64(i, i, i, i);
}
return x;
}
int doCall10Int64(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function10Int64(i, i, i, i, i, i, i, i, i, i);
}
return x;
}
int doCall20Int64(int length) {
int x = 0;
for (int i = 0; i < length; i++) {
x += function20Int64(
i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
}
return x;
}
int doCall1Int64Mint(int length) {
int x = 0x7FFFFFFF00000000;
for (int i = 0; i < length; i++) {
x = function1Int64(x);
}
return x;
}
double doCall1Float(int length) {
double x = 0.0;
for (int i = 0; i < length; i++) {
x += function1Float(17.0);
}
return x;
}
double doCall2Float(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function2Float(1.0, 2.0);
}
return x;
}
double doCall4Float(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function4Float(1.0, 2.0, 3.0, 4.0);
}
return x;
}
double doCall10Float(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function10Float(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
}
return x;
}
double doCall20Float(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function20Float(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
}
return x;
}
double doCall1Double(int length) {
double x = 0.0;
for (int i = 0; i < length; i++) {
x += function1Double(17.0);
}
return x;
}
double doCall2Double(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function2Double(1.0, 2.0);
}
return x;
}
double doCall4Double(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function4Double(1.0, 2.0, 3.0, 4.0);
}
return x;
}
double doCall10Double(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function10Double(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
}
return x;
}
double doCall20Double(int length) {
double x = 0;
for (int i = 0; i < length; i++) {
x += function20Double(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
}
return x;
}
Pointer<Uint8> doCall1PointerUint8(int length, Pointer<Uint8> p1) {
Pointer<Uint8> x = p1;
for (int i = 0; i < length; i++) {
x = function1PointerUint8(x);
}
return x;
}
Pointer<Uint8> doCall2PointerUint8(
int length, Pointer<Uint8> p1, Pointer<Uint8> p2) {
Pointer<Uint8> x = p1;
for (int i = 0; i < length; i++) {
x = function2PointerUint8(x, p2);
}
return x;
}
Pointer<Uint8> doCall4PointerUint8(int length, Pointer<Uint8> p1,
Pointer<Uint8> p2, Pointer<Uint8> p3, Pointer<Uint8> p4) {
Pointer<Uint8> x = p1;
for (int i = 0; i < length; i++) {
x = function4PointerUint8(x, p2, p3, p4);
}
return x;
}
Pointer<Uint8> doCall10PointerUint8(
int length,
Pointer<Uint8> p1,
Pointer<Uint8> p2,
Pointer<Uint8> p3,
Pointer<Uint8> p4,
Pointer<Uint8> p5,
Pointer<Uint8> p6,
Pointer<Uint8> p7,
Pointer<Uint8> p8,
Pointer<Uint8> p9,
Pointer<Uint8> p10) {
Pointer<Uint8> x = p1;
for (int i = 0; i < length; i++) {
x = function10PointerUint8(x, p2, p3, p4, p5, p6, p7, p8, p9, p10);
}
return x;
}
Pointer<Uint8> doCall20PointerUint8(
int length,
Pointer<Uint8> p1,
Pointer<Uint8> p2,
Pointer<Uint8> p3,
Pointer<Uint8> p4,
Pointer<Uint8> p5,
Pointer<Uint8> p6,
Pointer<Uint8> p7,
Pointer<Uint8> p8,
Pointer<Uint8> p9,
Pointer<Uint8> p10,
Pointer<Uint8> p11,
Pointer<Uint8> p12,
Pointer<Uint8> p13,
Pointer<Uint8> p14,
Pointer<Uint8> p15,
Pointer<Uint8> p16,
Pointer<Uint8> p17,
Pointer<Uint8> p18,
Pointer<Uint8> p19,
Pointer<Uint8> p20) {
Pointer<Uint8> x = p1;
for (int i = 0; i < length; i++) {
x = function20PointerUint8(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12,
p13, p14, p15, p16, p17, p18, p19, p20);
}
return x;
}
Object doCall1Handle(int length, Object p1) {
Object x = p1;
for (int i = 0; i < length; i++) {
x = function1handle(x);
}
return x;
}
Object doCall2Handle(int length, Object p1, Object p2) {
Object x = p1;
for (int i = 0; i < length; i++) {
x = function2handle(x, p2);
}
return x;
}
Object doCall4Handle(int length, Object p1, Object p2, Object p3, Object p4) {
Object x = p1;
for (int i = 0; i < length; i++) {
x = function4handle(x, p2, p3, p4);
}
return x;
}
Object doCall10Handle(int length, Object p1, Object p2, Object p3, Object p4,
Object p5, Object p6, Object p7, Object p8, Object p9, Object p10) {
Object x = p1;
for (int i = 0; i < length; i++) {
x = function10handle(x, p2, p3, p4, p5, p6, p7, p8, p9, p10);
}
return x;
}
Object doCall20Handle(
int length,
Object p1,
Object p2,
Object p3,
Object p4,
Object p5,
Object p6,
Object p7,
Object p8,
Object p9,
Object p10,
Object p11,
Object p12,
Object p13,
Object p14,
Object p15,
Object p16,
Object p17,
Object p18,
Object p19,
Object p20) {
Object x = p1;
for (int i = 0; i < length; i++) {
x = function20handle(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
p14, p15, p16, p17, p18, p19, p20);
}
return x;
}
//
// Benchmark fixtures.
//
// Number of repeats: 1000
// * CPU: Intel(R) Xeon(R) Gold 6154
// * Architecture: x64
// * 200 - 1100 us
const N = 1000;
class Uint8x01 extends BenchmarkBase {
Uint8x01() : super('FfiCall.Uint8x01');
@override
void run() {
final int x = doCall1Uint8(N);
if (x != N * 17 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Uint16x01 extends BenchmarkBase {
Uint16x01() : super('FfiCall.Uint16x01');
@override
void run() {
final int x = doCall1Uint16(N);
if (x != N * 17 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Uint32x01 extends BenchmarkBase {
Uint32x01() : super('FfiCall.Uint32x01');
@override
void run() {
final int x = doCall1Uint32(N);
if (x != N * (N - 1) / 2 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Uint64x01 extends BenchmarkBase {
Uint64x01() : super('FfiCall.Uint64x01');
@override
void run() {
final int x = doCall1Uint64(N);
if (x != N * (N - 1) / 2 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int8x01 extends BenchmarkBase {
Int8x01() : super('FfiCall.Int8x01');
@override
void run() {
final int x = doCall1Int8(N);
if (x != N * 17 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int16x01 extends BenchmarkBase {
Int16x01() : super('FfiCall.Int16x01');
@override
void run() {
final int x = doCall1Int16(N);
if (x != N * 17 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int32x01 extends BenchmarkBase {
Int32x01() : super('FfiCall.Int32x01');
@override
void run() {
final int x = doCall1Int32(N);
if (x != N * (N - 1) / 2 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int32x02 extends BenchmarkBase {
Int32x02() : super('FfiCall.Int32x02');
@override
void run() {
final int x = doCall2Int32(N);
if (x != N * (N - 1) * 2 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int32x04 extends BenchmarkBase {
Int32x04() : super('FfiCall.Int32x04');
@override
void run() {
final int x = doCall4Int32(N);
if (x != N * (N - 1) * 4 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int32x10 extends BenchmarkBase {
Int32x10() : super('FfiCall.Int32x10');
@override
void run() {
final int x = doCall10Int32(N);
if (x != N * (N - 1) * 10 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int32x20 extends BenchmarkBase {
Int32x20() : super('FfiCall.Int32x20');
@override
void run() {
final int x = doCall20Int32(N);
if (x != N * (N - 1) * 20 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int64x01 extends BenchmarkBase {
Int64x01() : super('FfiCall.Int64x01');
@override
void run() {
final int x = doCall1Int64(N);
if (x != N * (N - 1) / 2 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int64x02 extends BenchmarkBase {
Int64x02() : super('FfiCall.Int64x02');
@override
void run() {
final int x = doCall2Int64(N);
if (x != N * (N - 1) * 2 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int64x04 extends BenchmarkBase {
Int64x04() : super('FfiCall.Int64x04');
@override
void run() {
final int x = doCall4Int64(N);
if (x != N * (N - 1) * 4 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int64x10 extends BenchmarkBase {
Int64x10() : super('FfiCall.Int64x10');
@override
void run() {
final int x = doCall10Int64(N);
if (x != N * (N - 1) * 10 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int64x20 extends BenchmarkBase {
Int64x20() : super('FfiCall.Int64x20');
@override
void run() {
final int x = doCall20Int64(N);
if (x != N * (N - 1) * 20 / 2) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Int64Mintx01 extends BenchmarkBase {
Int64Mintx01() : super('FfiCall.Int64Mintx01');
@override
void run() {
final int x = doCall1Int64Mint(N);
if (x != 0x7FFFFFFF00000000 + N * 42) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Floatx01 extends BenchmarkBase {
Floatx01() : super('FfiCall.Floatx01');
@override
void run() {
final double x = doCall1Float(N);
final double expected = N * (N - 1) / 2 + N * 42;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Floatx02 extends BenchmarkBase {
Floatx02() : super('FfiCall.Floatx02');
@override
void run() {
final double x = doCall2Float(N);
final double expected = N * 55.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Floatx04 extends BenchmarkBase {
Floatx04() : super('FfiCall.Floatx04');
@override
void run() {
final double x = doCall4Float(N);
final double expected = N * 55.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Floatx10 extends BenchmarkBase {
Floatx10() : super('FfiCall.Floatx10');
@override
void run() {
final double x = doCall10Float(N);
final double expected = N * 55.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Floatx20 extends BenchmarkBase {
Floatx20() : super('FfiCall.Floatx20');
@override
void run() {
final double x = doCall20Float(N);
final double expected = N * 220.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Doublex01 extends BenchmarkBase {
Doublex01() : super('FfiCall.Doublex01');
@override
void run() {
final double x = doCall1Double(N);
final double expected = N * (N - 1) / 2 + N * 42;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Doublex02 extends BenchmarkBase {
Doublex02() : super('FfiCall.Doublex02');
@override
void run() {
final double x = doCall2Double(N);
final double expected = N * 55.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Doublex04 extends BenchmarkBase {
Doublex04() : super('FfiCall.Doublex04');
@override
void run() {
final double x = doCall4Double(N);
final double expected = N * 55.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Doublex10 extends BenchmarkBase {
Doublex10() : super('FfiCall.Doublex10');
@override
void run() {
final double x = doCall10Double(N);
final double expected = N * 55.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Doublex20 extends BenchmarkBase {
Doublex20() : super('FfiCall.Doublex20');
@override
void run() {
final double x = doCall20Double(N);
final double expected = N * 220.0;
if (0.999 * expected > x && x > 1.001 * expected) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class PointerUint8x01 extends BenchmarkBase {
PointerUint8x01() : super('FfiCall.PointerUint8x01');
Pointer<Uint8> pointer;
@override
void setup() => pointer = calloc(N + 1);
@override
void teardown() => calloc.free(pointer);
@override
void run() {
final Pointer<Uint8> x = doCall1PointerUint8(N, pointer);
if (x.address != pointer.address + N) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class PointerUint8x02 extends BenchmarkBase {
PointerUint8x02() : super('FfiCall.PointerUint8x02');
Pointer<Uint8> pointer, pointer2;
@override
void setup() {
pointer = calloc(N + 1);
pointer2 = pointer.elementAt(1);
}
@override
void teardown() {
calloc.free(pointer);
}
@override
void run() {
final Pointer<Uint8> x = doCall2PointerUint8(N, pointer, pointer2);
if (x.address != pointer.address + N * sizeOf<Uint8>()) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class PointerUint8x04 extends BenchmarkBase {
PointerUint8x04() : super('FfiCall.PointerUint8x04');
Pointer<Uint8> pointer, pointer2, pointer3, pointer4;
@override
void setup() {
pointer = calloc(N + 1);
pointer2 = pointer.elementAt(1);
pointer3 = pointer.elementAt(2);
pointer4 = pointer.elementAt(3);
}
@override
void teardown() {
calloc.free(pointer);
}
@override
void run() {
final Pointer<Uint8> x =
doCall4PointerUint8(N, pointer, pointer2, pointer3, pointer4);
if (x.address != pointer.address + N * sizeOf<Uint8>()) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class PointerUint8x10 extends BenchmarkBase {
PointerUint8x10() : super('FfiCall.PointerUint8x10');
Pointer<Uint8> pointer,
pointer2,
pointer3,
pointer4,
pointer5,
pointer6,
pointer7,
pointer8,
pointer9,
pointer10;
@override
void setup() {
pointer = calloc(N + 1);
pointer2 = pointer.elementAt(1);
pointer3 = pointer.elementAt(2);
pointer4 = pointer.elementAt(3);
pointer5 = pointer.elementAt(4);
pointer6 = pointer.elementAt(5);
pointer7 = pointer.elementAt(6);
pointer8 = pointer.elementAt(7);
pointer9 = pointer.elementAt(8);
pointer10 = pointer.elementAt(9);
}
@override
void teardown() {
calloc.free(pointer);
}
@override
void run() {
final Pointer<Uint8> x = doCall10PointerUint8(
N,
pointer,
pointer2,
pointer3,
pointer4,
pointer5,
pointer6,
pointer7,
pointer8,
pointer9,
pointer10);
if (x.address != pointer.address + N * sizeOf<Uint8>()) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class PointerUint8x20 extends BenchmarkBase {
PointerUint8x20() : super('FfiCall.PointerUint8x20');
Pointer<Uint8> pointer,
pointer2,
pointer3,
pointer4,
pointer5,
pointer6,
pointer7,
pointer8,
pointer9,
pointer10,
pointer11,
pointer12,
pointer13,
pointer14,
pointer15,
pointer16,
pointer17,
pointer18,
pointer19,
pointer20;
@override
void setup() {
pointer = calloc(N + 1);
pointer2 = pointer.elementAt(1);
pointer3 = pointer.elementAt(2);
pointer4 = pointer.elementAt(3);
pointer5 = pointer.elementAt(4);
pointer6 = pointer.elementAt(5);
pointer7 = pointer.elementAt(6);
pointer8 = pointer.elementAt(7);
pointer9 = pointer.elementAt(8);
pointer10 = pointer.elementAt(9);
pointer11 = pointer.elementAt(10);
pointer12 = pointer.elementAt(11);
pointer13 = pointer.elementAt(12);
pointer14 = pointer.elementAt(13);
pointer15 = pointer.elementAt(14);
pointer16 = pointer.elementAt(15);
pointer17 = pointer.elementAt(16);
pointer18 = pointer.elementAt(17);
pointer19 = pointer.elementAt(18);
pointer20 = pointer.elementAt(19);
}
@override
void teardown() {
calloc.free(pointer);
}
@override
void run() {
final Pointer<Uint8> x = doCall20PointerUint8(
N,
pointer,
pointer2,
pointer3,
pointer4,
pointer5,
pointer6,
pointer7,
pointer8,
pointer9,
pointer10,
pointer11,
pointer12,
pointer13,
pointer14,
pointer15,
pointer16,
pointer17,
pointer18,
pointer19,
pointer20);
if (x.address != pointer.address + N * sizeOf<Uint8>()) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class MyClass {
int a;
MyClass(this.a);
}
class Handlex01 extends BenchmarkBase {
Handlex01() : super('FfiCall.Handlex01');
@override
void run() {
final p1 = MyClass(123);
final x = doCall1Handle(N, p1);
if (!identical(p1, x)) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Handlex02 extends BenchmarkBase {
Handlex02() : super('FfiCall.Handlex02');
@override
void run() {
final p1 = MyClass(123);
final p2 = MyClass(2);
final x = doCall2Handle(N, p1, p2);
if (!identical(p1, x)) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Handlex04 extends BenchmarkBase {
Handlex04() : super('FfiCall.Handlex04');
@override
void run() {
final p1 = MyClass(123);
final p2 = MyClass(2);
final p3 = MyClass(3);
final p4 = MyClass(4);
final x = doCall4Handle(N, p1, p2, p3, p4);
if (!identical(p1, x)) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Handlex10 extends BenchmarkBase {
Handlex10() : super('FfiCall.Handlex10');
@override
void run() {
final p1 = MyClass(123);
final p2 = MyClass(2);
final p3 = MyClass(3);
final p4 = MyClass(4);
final p5 = MyClass(5);
final p6 = MyClass(6);
final p7 = MyClass(7);
final p8 = MyClass(8);
final p9 = MyClass(9);
final p10 = MyClass(10);
final x = doCall10Handle(N, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
if (!identical(p1, x)) {
throw Exception('$name: Unexpected result: $x');
}
}
}
class Handlex20 extends BenchmarkBase {
Handlex20() : super('FfiCall.Handlex20');
@override
void run() {
final p1 = MyClass(123);
final p2 = MyClass(2);
final p3 = MyClass(3);
final p4 = MyClass(4);
final p5 = MyClass(5);
final p6 = MyClass(6);
final p7 = MyClass(7);
final p8 = MyClass(8);
final p9 = MyClass(9);
final p10 = MyClass(10);
final p11 = MyClass(11);
final p12 = MyClass(12);
final p13 = MyClass(13);
final p14 = MyClass(14);
final p15 = MyClass(15);
final p16 = MyClass(16);
final p17 = MyClass(17);
final p18 = MyClass(18);
final p19 = MyClass(19);
final p20 = MyClass(20);
final x = doCall20Handle(N, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11,
p12, p13, p14, p15, p16, p17, p18, p19, p20);
if (!identical(p1, x)) {
throw Exception('$name: Unexpected result: $x');
}
}
}
//
// Main driver.
//
void main() {
final benchmarks = [
() => Uint8x01(),
() => Uint16x01(),
() => Uint32x01(),
() => Uint64x01(),
() => Int8x01(),
() => Int16x01(),
() => Int32x01(),
() => Int32x02(),
() => Int32x04(),
() => Int32x10(),
() => Int32x20(),
() => Int64x01(),
() => Int64x02(),
() => Int64x04(),
() => Int64x10(),
() => Int64x20(),
() => Int64Mintx01(),
() => Floatx01(),
() => Floatx02(),
() => Floatx04(),
() => Floatx10(),
() => Floatx20(),
() => Doublex01(),
() => Doublex02(),
() => Doublex04(),
() => Doublex10(),
() => Doublex20(),
() => PointerUint8x01(),
() => PointerUint8x02(),
() => PointerUint8x04(),
() => PointerUint8x10(),
() => PointerUint8x20(),
() => Handlex01(),
() => Handlex02(),
() => Handlex04(),
() => Handlex10(),
() => Handlex20(),
];
for (final benchmark in benchmarks) {
benchmark().report();
}
}