| // 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); |
| }); |
| } |