// Copyright (c) 2023, 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. /// Various math benchmarks from https://github.com/yjbanov/uimatrix import 'dart:math' as math; import 'package:benchmark_harness/benchmark_harness.dart'; import 'package:vector_math/vector_math_64.dart'; import 'uimatrix.dart'; const int N = 5000; Object? sink; void main() { InstantiateIdentityMatrix4().report(); InstantiateIdentityUiMatrix().report(); Instantiate2DTranslationMatrix4().report(); Instantiate2DTranslationUiMatrix().report(); InstantiateSimple2DMatrix4().report(); InstantiateSimple2DUiMatrix().report(); InstantiateComplexMatrix4().report(); InstantiateComplexUiMatrix().report(); MultiplyIdentityByIdentityMatrix4().report(); MultiplyIdentityByIdentityUiMatrix().report(); MultiplySimply2DByIdentityMatrix4().report(); MultiplySimply2DByIdentityUiMatrix().report(); MultiplySimple2DBySimple2DMatrix4().report(); MultiplySimple2DBySimple2DUiMatrix().report(); MultiplyComplexByComplexMatrix4().report(); MultiplyComplexByComplexUiMatrix().report(); AddIdentityPlusIdentityMatrix4().report(); AddIdentityPlusIdentityUiMatrix().report(); AddSimple2DPlusIdentityMatrix4().report(); AddSimple2DPlusIdentityUiMatrix().report(); AddSimple2DPlusSimple2DMatrix4().report(); AddSimple2DPlusSimple2DUiMatrix().report(); AddComplexPlusComplexMatrix4().report(); AddComplexPlusComplexUiMatrix().report(); InversionIdentityMatrix4().report(); InversionIdentityUiMatrix().report(); InversionSimple2DMatrix4().report(); InversionSimple2DUiMatrix().report(); InversionComplexMatrix4().report(); InversionComplexUiMatrix().report(); DeterminantIdentityMatrix4().report(); DeterminantIdentityUiMatrix().report(); DeterminantSimple2DMatrix4().report(); DeterminantSimple2DUiMatrix().report(); DeterminantComplexMatrix4().report(); DeterminantComplexUiMatrix().report(); } class InstantiateIdentityMatrix4 extends BenchmarkBase { InstantiateIdentityMatrix4() : super('UiMatrix.Instantiate_Identity_Matrix4'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += Matrix4.identity().storage[0]; } sink = total; } } class InstantiateIdentityUiMatrix extends BenchmarkBase { InstantiateIdentityUiMatrix() : super('UiMatrix.Instantiate_Identity_UiMatrix'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += UiMatrix.identity.scaleX; } sink = total; } } class Instantiate2DTranslationMatrix4 extends BenchmarkBase { Instantiate2DTranslationMatrix4() : super('UiMatrix.Instantiate_2DTranslation_Matrix4'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += Matrix4.translationValues(0.4, 3.45, 0).storage[0]; } sink = total; } } class Instantiate2DTranslationUiMatrix extends BenchmarkBase { Instantiate2DTranslationUiMatrix() : super('UiMatrix.Instantiate_2DTranslation_UiMatrix'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += UiMatrix.translation2d(dx: 0.4, dy: 3.45).scaleX; } sink = total; } } class InstantiateSimple2DMatrix4 extends BenchmarkBase { InstantiateSimple2DMatrix4() : super('UiMatrix.Instantiate_Simple2D_Matrix4'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (Matrix4.identity() ..translate(0.4, 3.45) ..scale(1.2, 2.3)) .storage[0]; } sink = total; } } class InstantiateSimple2DUiMatrix extends BenchmarkBase { InstantiateSimple2DUiMatrix() : super('UiMatrix.Instantiate_Simple2D_UiMatrix'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += UiMatrix.simple2d(scaleX: 1.2, scaleY: 2.3, dx: 0.4, dy: 3.45).scaleX; } sink = total; } } class InstantiateComplexMatrix4 extends BenchmarkBase { InstantiateComplexMatrix4() : super('UiMatrix.Instantiate_Complex_Matrix4'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (Matrix4.identity() ..rotateZ(0.1) ..translate(0.4, 3.45)) .storage[0]; } sink = total; } } class InstantiateComplexUiMatrix extends BenchmarkBase { InstantiateComplexUiMatrix() : super('UiMatrix.Instantiate_Complex_UiMatrix'); @override void run() { double total = 0; for (int i = 0; i < N; i++) { final cosAngle = math.cos(0.1); final sinAngle = math.sin(0.1); total += UiMatrix.transform2d( scaleX: cosAngle, scaleY: cosAngle, k1: -sinAngle, k2: sinAngle, dx: 0.4, dy: 3.45, ).scaleX; } sink = total; } } late UiMatrix a; late UiMatrix b; late Matrix4 a4; late Matrix4 b4; class MultiplyIdentityByIdentityMatrix4 extends BenchmarkBase { MultiplyIdentityByIdentityMatrix4() : super('UiMatrix.Multiply_IdentityByIdentity_Matrix4') { a4 = Matrix4.identity(); b4 = Matrix4.identity(); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 * b4 as Matrix4).storage[0]; } sink = total; } } class MultiplyIdentityByIdentityUiMatrix extends BenchmarkBase { MultiplyIdentityByIdentityUiMatrix() : super('UiMatrix.Multiply_IdentityByIdentity_UiMatrix') { a = UiMatrix.identity; b = UiMatrix.identity; } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a * b).scaleX; } sink = total; } } class MultiplySimply2DByIdentityMatrix4 extends BenchmarkBase { MultiplySimply2DByIdentityMatrix4() : super('UiMatrix.Multiply_Simple2DByIdentity_Matrix4') { a4 = Matrix4.identity() ..translate(0.4, 3.45) ..scale(1.2, 2.3); b4 = Matrix4.identity(); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 * b4 as Matrix4).storage[0]; } sink = total; } } class MultiplySimply2DByIdentityUiMatrix extends BenchmarkBase { MultiplySimply2DByIdentityUiMatrix() : super('UiMatrix.Multiply_Simple2DByIdentity_UiMatrix') { a = UiMatrix.simple2d(scaleX: 1.2, scaleY: 2.3, dx: 0.4, dy: 3.45); b = UiMatrix.identity; } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a * b).scaleX; } sink = total; } } class MultiplySimple2DBySimple2DMatrix4 extends BenchmarkBase { MultiplySimple2DBySimple2DMatrix4() : super('UiMatrix.Multiply_Simple2DBySimple2D_Matrix4') { a4 = Matrix4.identity() ..translate(0.4, 3.45) ..scale(1.2, 2.3); b4 = Matrix4.identity() ..translate(0.5, 3.46) ..scale(1.7, 2.8); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 * b4 as Matrix4).storage[0]; } sink = total; } } class MultiplySimple2DBySimple2DUiMatrix extends BenchmarkBase { MultiplySimple2DBySimple2DUiMatrix() : super('UiMatrix.Multiply_Simple2DBySimple2D_UiMatrix') { a = UiMatrix.simple2d(scaleX: 1.2, scaleY: 2.3, dx: 0.4, dy: 3.45); b = UiMatrix.simple2d(scaleX: 1.3, scaleY: 2.4, dx: 0.5, dy: 3.46); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a * b).scaleX; } sink = total; } } class MultiplyComplexByComplexMatrix4 extends BenchmarkBase { MultiplyComplexByComplexMatrix4() : super('UiMatrix.Multiply_ComplexByComplex_Matrix4') { a4 = Matrix4.identity() ..rotateZ(0.1) ..translate(0.4, 3.45); b4 = Matrix4.identity() ..rotateZ(0.2) ..translate(0.3, 3.44); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 * b4 as Matrix4).storage[0]; } sink = total; } } class MultiplyComplexByComplexUiMatrix extends BenchmarkBase { MultiplyComplexByComplexUiMatrix() : super('UiMatrix.Multiply_ComplexByComplex_UiMatrix') { a = UiMatrix.transform2d( scaleX: math.cos(0.1), scaleY: math.cos(0.1), k1: -math.sin(0.1), k2: math.sin(0.1), dx: 0.4, dy: 3.45, ); b = UiMatrix.transform2d( scaleX: math.cos(0.2), scaleY: math.cos(0.2), k1: -math.sin(0.2), k2: math.sin(0.2), dx: 0.4, dy: 3.45, ); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a * b).scaleX; } sink = total; } } class AddIdentityPlusIdentityMatrix4 extends BenchmarkBase { AddIdentityPlusIdentityMatrix4() : super('UiMatrix.Add_IdentityPlusIdentity_Matrix4') { a4 = Matrix4.identity(); b4 = Matrix4.identity(); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 + b4).storage[0]; } sink = total; } } class AddIdentityPlusIdentityUiMatrix extends BenchmarkBase { AddIdentityPlusIdentityUiMatrix() : super('UiMatrix.Add_IdentityPlusIdentity_UiMatrix') { a = UiMatrix.identity; b = UiMatrix.identity; } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a + b).scaleX; } sink = total; } } class AddSimple2DPlusIdentityMatrix4 extends BenchmarkBase { AddSimple2DPlusIdentityMatrix4() : super('UiMatrix.Add_Simple2DPlusIdentity_Matrix4') { a4 = Matrix4.identity() ..translate(0.4, 3.45) ..scale(1.2, 2.3); b4 = Matrix4.identity(); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 + b4).storage[0]; } sink = total; } } class AddSimple2DPlusIdentityUiMatrix extends BenchmarkBase { AddSimple2DPlusIdentityUiMatrix() : super('UiMatrix.Add_Simple2DPlusIdentity_UiMatrix') { a = UiMatrix.simple2d(scaleX: 1.2, scaleY: 2.3, dx: 0.4, dy: 3.45); b = UiMatrix.identity; } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a + b).scaleX; } sink = total; } } class AddSimple2DPlusSimple2DMatrix4 extends BenchmarkBase { AddSimple2DPlusSimple2DMatrix4() : super('UiMatrix.Add_Simple2DPlusSimple2D_Matrix4') { a4 = Matrix4.identity() ..translate(0.4, 3.45) ..scale(1.2, 2.3); b4 = Matrix4.identity() ..translate(0.5, 3.46) ..scale(1.7, 2.8); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 + b4).storage[0]; } sink = total; } } class AddSimple2DPlusSimple2DUiMatrix extends BenchmarkBase { AddSimple2DPlusSimple2DUiMatrix() : super('UiMatrix.Add_Simple2DPlusSimple2D_UiMatrix') { a = UiMatrix.simple2d(scaleX: 1.2, scaleY: 2.3, dx: 0.4, dy: 3.45); b = UiMatrix.simple2d(scaleX: 1.3, scaleY: 2.4, dx: 0.5, dy: 3.46); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a + b).scaleX; } sink = total; } } class AddComplexPlusComplexMatrix4 extends BenchmarkBase { AddComplexPlusComplexMatrix4() : super('UiMatrix.Add_ComplexPlusComplex_Matrix4') { a4 = Matrix4.identity() ..rotateZ(0.1) ..translate(0.4, 3.45); b4 = Matrix4.identity() ..rotateZ(0.2) ..translate(0.3, 3.44); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a4 + b4).storage[0]; } sink = total; } } class AddComplexPlusComplexUiMatrix extends BenchmarkBase { AddComplexPlusComplexUiMatrix() : super('UiMatrix.Add_ComplexPlusComplex_UiMatrix') { a = UiMatrix.transform2d( scaleX: math.cos(0.1), scaleY: math.cos(0.1), k1: -math.sin(0.1), k2: math.sin(0.1), dx: 0.4, dy: 3.45, ); b = UiMatrix.transform2d( scaleX: math.cos(0.2), scaleY: math.cos(0.2), k1: -math.sin(0.2), k2: math.sin(0.2), dx: 0.4, dy: 3.45, ); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += (a + b).scaleX; } sink = total; } } class InversionIdentityMatrix4 extends BenchmarkBase { InversionIdentityMatrix4() : super('UiMatrix.Inversion_Identity_Matrix4') { a4 = Matrix4.identity(); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { final Matrix4 m = Matrix4.zero()..copyInverse(a4); total += m.storage[0]; } sink = total; } } class InversionIdentityUiMatrix extends BenchmarkBase { InversionIdentityUiMatrix() : super('UiMatrix.Inversion_Identity_UiMatrix') { a = UiMatrix.identity; } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a.invert()!.scaleX; } sink = total; } } class InversionSimple2DMatrix4 extends BenchmarkBase { InversionSimple2DMatrix4() : super('UiMatrix.Inversion_Simple2D_Matrix4') { a4 = Matrix4.identity() ..translate(0.4, 3.45) ..scale(1.2, 2.3); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { final Matrix4 m = Matrix4.zero()..copyInverse(a4); total += m.storage[0]; } sink = total; } } class InversionSimple2DUiMatrix extends BenchmarkBase { InversionSimple2DUiMatrix() : super('UiMatrix.Inversion_Simple2D_UiMatrix') { a = UiMatrix.simple2d(scaleX: 1.2, scaleY: 2.3, dx: 0.4, dy: 3.45); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a.invert()!.scaleX; } sink = total; } } class InversionComplexMatrix4 extends BenchmarkBase { InversionComplexMatrix4() : super('UiMatrix.Inversion_Complex_Matrix4') { a4 = Matrix4.identity() ..rotateZ(0.1) ..translate(0.4, 3.45); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { final Matrix4 m = Matrix4.zero()..copyInverse(a4); total += m.storage[0]; } sink = total; } } class InversionComplexUiMatrix extends BenchmarkBase { InversionComplexUiMatrix() : super('UiMatrix.Inversion_Complex_UiMatrix') { a = UiMatrix.transform2d( scaleX: math.cos(0.1), scaleY: math.cos(0.1), k1: -math.sin(0.1), k2: math.sin(0.1), dx: 0.4, dy: 3.45, ); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a.invert()!.scaleX; } sink = total; } } class DeterminantIdentityMatrix4 extends BenchmarkBase { DeterminantIdentityMatrix4() : super('UiMatrix.Determinant_Identity_Matrix4') { a4 = Matrix4.identity(); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a4.determinant(); } sink = total; } } class DeterminantIdentityUiMatrix extends BenchmarkBase { DeterminantIdentityUiMatrix() : super('UiMatrix.Determinant_Identity_UiMatrix') { a = UiMatrix.identity; } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a.determinant(); } sink = total; } } class DeterminantSimple2DMatrix4 extends BenchmarkBase { DeterminantSimple2DMatrix4() : super('UiMatrix.Determinant_Simple2D_Matrix4') { a4 = Matrix4.identity() ..translate(0.4, 3.45) ..scale(1.2, 2.3); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a4.determinant(); } sink = total; } } class DeterminantSimple2DUiMatrix extends BenchmarkBase { DeterminantSimple2DUiMatrix() : super('UiMatrix.Determinant_Simple2D_UiMatrix') { a = UiMatrix.simple2d(scaleX: 1.2, scaleY: 2.3, dx: 0.4, dy: 3.45); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a.determinant(); } sink = total; } } class DeterminantComplexMatrix4 extends BenchmarkBase { DeterminantComplexMatrix4() : super('UiMatrix.Determinant_Complex_Matrix4') { a4 = Matrix4.identity() ..rotateZ(0.1) ..translate(0.4, 3.45); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a4.determinant(); } sink = total; } } class DeterminantComplexUiMatrix extends BenchmarkBase { DeterminantComplexUiMatrix() : super('UiMatrix.Determinant_Complex_UiMatrix') { a = UiMatrix.transform2d( scaleX: math.cos(0.1), scaleY: math.cos(0.1), k1: -math.sin(0.1), k2: math.sin(0.1), dx: 0.4, dy: 3.45, ); } @override void run() { double total = 0; for (int i = 0; i < N; i++) { total += a.determinant(); } sink = total; } }