| // Copyright (c) 2022, 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. | 
 |  | 
 | import "dart:async"; | 
 | import "dart:io"; | 
 | import "dart:typed_data"; | 
 |  | 
 | import "package:expect/expect.dart"; | 
 | import "test_utils.dart" show withTempDir; | 
 |  | 
 | const chunkCount = 8192; | 
 | const chunkSize = 8192; | 
 |  | 
 | Future<int> timeWrite(File file, chunks) async { | 
 |   final sink = file.openWrite(); | 
 |  | 
 |   final Stopwatch stopwatch = new Stopwatch()..start(); | 
 |   for (var chunk in chunks) { | 
 |     sink.add(chunk); | 
 |   } | 
 |   await sink.close(); | 
 |   stopwatch.stop(); | 
 |  | 
 |   Expect.equals(chunkCount * chunkSize, await file.length()); | 
 |  | 
 |   await file.delete(); | 
 |  | 
 |   return stopwatch.elapsedMilliseconds; | 
 | } | 
 |  | 
 | main() async { | 
 |   await withTempDir("regress50206", (Directory tempDir) async { | 
 |     File file = new File("${tempDir.path}/file.tmp"); | 
 |  | 
 |     int arrayTime = 0; | 
 |     { | 
 |       var chunks = []; | 
 |       for (var i = 0; i < chunkCount; i++) { | 
 |         var chunk = new Uint8List(chunkSize); | 
 |         chunks.add(chunk); | 
 |       } | 
 |       arrayTime = await timeWrite(file, chunks); | 
 |       print("arrays: $arrayTime ms"); | 
 |     } | 
 |  | 
 |     int unmodifiableArrayTime = 0; | 
 |     { | 
 |       var chunks = []; | 
 |       for (var i = 0; i < chunkCount; i++) { | 
 |         var chunk = new Uint8List(chunkSize).asUnmodifiableView(); | 
 |         chunks.add(chunk); | 
 |       } | 
 |       unmodifiableArrayTime = await timeWrite(file, chunks); | 
 |       print("unmodifiable arrays: $unmodifiableArrayTime ms"); | 
 |     } | 
 |  | 
 |     int viewTime = 0; | 
 |     { | 
 |       var chunks = []; | 
 |       var backing = new Uint8List(chunkSize * chunkCount); | 
 |       for (var i = 0; i < chunkCount; i++) { | 
 |         var chunk = new Uint8List.view( | 
 |           backing.buffer, | 
 |           i * chunkSize, | 
 |           chunkSize, | 
 |         ); | 
 |         chunks.add(chunk); | 
 |       } | 
 |       viewTime = await timeWrite(file, chunks); | 
 |       print("views: $viewTime ms"); | 
 |     } | 
 |  | 
 |     int unmodifiableViewTime = 0; | 
 |     { | 
 |       var chunks = []; | 
 |       var backing = new Uint8List(chunkSize * chunkCount); | 
 |       for (var i = 0; i < chunkCount; i++) { | 
 |         var chunk = new Uint8List.view( | 
 |           backing.buffer, | 
 |           i * chunkSize, | 
 |           chunkSize, | 
 |         ).asUnmodifiableView(); | 
 |         chunks.add(chunk); | 
 |       } | 
 |       unmodifiableViewTime = await timeWrite(file, chunks); | 
 |       print("unmodifiable views: $unmodifiableViewTime ms"); | 
 |     } | 
 |  | 
 |     // Assert with factor a 1000 to avoid the test being flaky from I/O | 
 |     // variance. If we copy the whole backing store for each view chunk, things | 
 |     // will be quadratically slower, i.e. more than a factor of 1000. | 
 |     Expect.isTrue(unmodifiableArrayTime / arrayTime < 1000); | 
 |     Expect.isTrue(viewTime / arrayTime < 1000); | 
 |     Expect.isTrue(unmodifiableViewTime / arrayTime < 1000); | 
 |   }); | 
 | } |