|  | // Copyright (c) 2020, 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. | 
|  |  | 
|  | // Micro-benchmarks for copying typed data lists. | 
|  |  | 
|  | import 'dart:typed_data'; | 
|  |  | 
|  | import 'package:benchmark_harness/benchmark_harness.dart'; | 
|  |  | 
|  | abstract class Uint8ListCopyBenchmark extends BenchmarkBase { | 
|  | final int size; | 
|  | late Uint8List input; | 
|  | late Uint8List result; | 
|  |  | 
|  | Uint8ListCopyBenchmark(String method, this.size) | 
|  | : super('TypedDataDuplicate.Uint8List.$size.$method'); | 
|  |  | 
|  | @override | 
|  | void setup() { | 
|  | input = Uint8List(size); | 
|  | for (var i = 0; i < size; ++i) { | 
|  | input[i] = (i + 3) & 0xff; | 
|  | } | 
|  | } | 
|  |  | 
|  | @override | 
|  | void warmup() { | 
|  | for (var i = 0; i < 100; ++i) { | 
|  | run(); | 
|  | } | 
|  | } | 
|  |  | 
|  | @override | 
|  | void teardown() { | 
|  | for (var i = 0; i < size; ++i) { | 
|  | if (result[i] != ((i + 3) & 0xff)) { | 
|  | throw 'Unexpected result'; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | class Uint8ListCopyViaFromListBenchmark extends Uint8ListCopyBenchmark { | 
|  | Uint8ListCopyViaFromListBenchmark(int size) : super('fromList', size); | 
|  |  | 
|  | @override | 
|  | void run() { | 
|  | result = Uint8List.fromList(input); | 
|  | } | 
|  | } | 
|  |  | 
|  | class Uint8ListCopyViaLoopBenchmark extends Uint8ListCopyBenchmark { | 
|  | Uint8ListCopyViaLoopBenchmark(int size) : super('loop', size); | 
|  |  | 
|  | @override | 
|  | void run() { | 
|  | final input = this.input; | 
|  | final result = Uint8List(input.length); | 
|  | for (var i = 0; i < input.length; i++) { | 
|  | result[i] = input[i]; | 
|  | } | 
|  | this.result = result; | 
|  | } | 
|  | } | 
|  |  | 
|  | abstract class Float64ListCopyBenchmark extends BenchmarkBase { | 
|  | final int size; | 
|  | late Float64List input; | 
|  | late Float64List result; | 
|  |  | 
|  | Float64ListCopyBenchmark(String method, this.size) | 
|  | : super('TypedDataDuplicate.Float64List.$size.$method'); | 
|  |  | 
|  | @override | 
|  | void setup() { | 
|  | input = Float64List(size); | 
|  | for (var i = 0; i < size; ++i) { | 
|  | input[i] = (i - 7).toDouble(); | 
|  | } | 
|  | } | 
|  |  | 
|  | @override | 
|  | void teardown() { | 
|  | for (var i = 0; i < size; ++i) { | 
|  | if (result[i] != (i - 7).toDouble()) { | 
|  | throw 'Unexpected result'; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | class Float64ListCopyViaFromListBenchmark extends Float64ListCopyBenchmark { | 
|  | Float64ListCopyViaFromListBenchmark(int size) : super('fromList', size); | 
|  |  | 
|  | @override | 
|  | void run() { | 
|  | result = Float64List.fromList(input); | 
|  | } | 
|  | } | 
|  |  | 
|  | class Float64ListCopyViaLoopBenchmark extends Float64ListCopyBenchmark { | 
|  | Float64ListCopyViaLoopBenchmark(int size) : super('loop', size); | 
|  |  | 
|  | @override | 
|  | void run() { | 
|  | final input = this.input; | 
|  | final result = Float64List(input.length); | 
|  | for (var i = 0; i < input.length; i++) { | 
|  | result[i] = input[i]; | 
|  | } | 
|  | this.result = result; | 
|  | } | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | final sizes = [8, 32, 256, 16384]; | 
|  | final benchmarks = [ | 
|  | for (int size in sizes) ...[ | 
|  | Uint8ListCopyViaLoopBenchmark(size), | 
|  | Uint8ListCopyViaFromListBenchmark(size) | 
|  | ], | 
|  | for (int size in sizes) ...[ | 
|  | Float64ListCopyViaLoopBenchmark(size), | 
|  | Float64ListCopyViaFromListBenchmark(size) | 
|  | ] | 
|  | ]; | 
|  | for (var bench in benchmarks) { | 
|  | bench.report(); | 
|  | } | 
|  | } |