blob: cbb84e5831a18ebb259f8ae847057505561aa61d [file] [log] [blame]
 // Copyright (c) 2019, Google Inc. 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. import 'package:benchmark_harness/benchmark_harness.dart'; import 'package:vector_math/vector_math_64.dart'; mixin Setup on BenchmarkBase { final beginTransform = Matrix4.compose( Vector3(1.0, 1.0, 1.0), Quaternion.euler(0.0, 0.0, 0.0), Vector3(1.0, 1.0, 1.0), ); final endTransform = Matrix4.compose( Vector3(5.0, 260.0, 1.0), Quaternion.euler(0.0, 1.0, -0.7), Vector3(0.6, 0.6, 0.6), ); @override void run() { var sum_traces = 0.0; for (var i = 0; i <= 1024; i++) { final t = i / 1024.0; final m1 = lerp(beginTransform, endTransform, t); final m2 = lerp(endTransform, beginTransform, t); sum_traces += m1.trace(); sum_traces += m2.trace(); } if (sum_traces < 6320 || sum_traces > 6321) { throw StateError('Bad result: \$sum_traces'); } } Matrix4 lerp(Matrix4 begin, Matrix4 end, double t); } class Matrix4TweenBenchmark1 extends BenchmarkBase with Setup { Matrix4TweenBenchmark1() : super('Matrix4TweenBenchmark1'); @override Matrix4 lerp(Matrix4 begin, Matrix4 end, double t) { final beginTranslation = Vector3.zero(); final endTranslation = Vector3.zero(); final beginRotation = Quaternion.identity(); final endRotation = Quaternion.identity(); final beginScale = Vector3.zero(); final endScale = Vector3.zero(); begin.decompose(beginTranslation, beginRotation, beginScale); end.decompose(endTranslation, endRotation, endScale); final lerpTranslation = beginTranslation * (1.0 - t) + endTranslation * t; final lerpRotation = (beginRotation.scaled(1.0 - t) + endRotation.scaled(t)).normalized(); final lerpScale = beginScale * (1.0 - t) + endScale * t; return Matrix4.compose(lerpTranslation, lerpRotation, lerpScale); } } class Matrix4TweenBenchmark2 extends BenchmarkBase with Setup { Matrix4TweenBenchmark2() : super('Matrix4TweenBenchmark2'); @override Matrix4 lerp(Matrix4 begin, Matrix4 end, double t) { begin.decompose(beginTranslation, beginRotation, beginScale); end.decompose(endTranslation, endRotation, endScale); Vector3.mix(beginTranslation, endTranslation, t, lerpTranslation); final lerpRotation = (beginRotation.scaled(1.0 - t) + endRotation.scaled(t)).normalized(); Vector3.mix(beginScale, endScale, t, lerpScale); return Matrix4.compose(lerpTranslation, lerpRotation, lerpScale); } // Pre-allocated vectors. static final beginTranslation = Vector3.zero(); static final endTranslation = Vector3.zero(); static final lerpTranslation = Vector3.zero(); static final beginRotation = Quaternion.identity(); static final endRotation = Quaternion.identity(); static final beginScale = Vector3.zero(); static final endScale = Vector3.zero(); static final lerpScale = Vector3.zero(); } class Matrix4TweenBenchmark3 extends BenchmarkBase with Setup { Matrix4TweenBenchmark3() : super('Matrix4TweenBenchmark3'); @override Matrix4 lerp(Matrix4 begin, Matrix4 end, double t) { begin.decompose(beginTranslation, beginRotation, beginScale); end.decompose(endTranslation, endRotation, endScale); Vector3.mix(beginTranslation, endTranslation, t, lerpTranslation); final lerpRotation = (beginRotation.scaled(1.0 - t) + endRotation.scaled(t)).normalized(); Vector3.mix(beginScale, endScale, t, lerpScale); return Matrix4.compose(lerpTranslation, lerpRotation, lerpScale); } late final beginTranslation = Vector3.zero(); late final endTranslation = Vector3.zero(); late final lerpTranslation = Vector3.zero(); late final beginRotation = Quaternion.identity(); late final endRotation = Quaternion.identity(); late final beginScale = Vector3.zero(); late final endScale = Vector3.zero(); late final lerpScale = Vector3.zero(); } void main() { final benchmarks = [ Matrix4TweenBenchmark1(), Matrix4TweenBenchmark2(), Matrix4TweenBenchmark3(), ]; // Warmup all bencmarks. for (var b in benchmarks) { b.run(); } for (var b in benchmarks) { b.exercise(); } for (var b in benchmarks) { b.report(); } }