refactor(example): update benchmark page
This commit is contained in:
parent
f592799970
commit
5729fff09b
@ -3,10 +3,11 @@
|
|||||||
// -----
|
// -----
|
||||||
// File: benchmark_page.dart
|
// File: benchmark_page.dart
|
||||||
// Created Date: 28/12/2021 15:12:39
|
// Created Date: 28/12/2021 15:12:39
|
||||||
// Last Modified: 25/05/2022 15:26:42
|
// Last Modified: 25/05/2022 17:16:12
|
||||||
// -----
|
// -----
|
||||||
// Copyright (c) 2021
|
// Copyright (c) 2021
|
||||||
|
|
||||||
|
import 'dart:math';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -24,10 +25,12 @@ class BenchmarkPage extends ConsumerWidget {
|
|||||||
final Output keyContent = Output();
|
final Output keyContent = Output();
|
||||||
final Output benchmarkStatus = Output(large: true);
|
final Output benchmarkStatus = Output(large: true);
|
||||||
|
|
||||||
Future<void> _benchmarkEncryptionOnly(
|
Future<void> _benchmark(
|
||||||
WidgetRef ref,
|
WidgetRef ref,
|
||||||
Cipher cipher,
|
Cipher cipher, {
|
||||||
) async {
|
bool usePc = false,
|
||||||
|
bool encryptionOnly = false,
|
||||||
|
}) async {
|
||||||
Session state = ref.read(sessionProvider.state).state;
|
Session state = ref.read(sessionProvider.state).state;
|
||||||
AesGcm pc = AesGcm();
|
AesGcm pc = AesGcm();
|
||||||
|
|
||||||
@ -37,79 +40,47 @@ class BenchmarkPage extends ConsumerWidget {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
benchmarkStatus.print("Benchmark 2/4/8/16/32/64/128/256MB\n");
|
List<int> testedSizes = [2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50];
|
||||||
List<int> testedSizes = [2, 4, 8, 16, 32, 64, 128, 256];
|
int multiplier = pow(2, 20).toInt(); // MiB
|
||||||
String csv = "size;encryption time\n";
|
|
||||||
|
|
||||||
|
benchmarkStatus.print("[Benchmark] Sizes: ${testedSizes.join('/')}MiB\n");
|
||||||
|
benchmarkStatus.appendln(
|
||||||
|
"[Benchmark] Engine: " + (usePc ? " PointyCastle" : " NativeCrypto"));
|
||||||
|
benchmarkStatus.appendln("[Benchmark] Test: " +
|
||||||
|
(encryptionOnly ? " Encryption Only" : " Encryption & Decryption"));
|
||||||
|
benchmarkStatus.appendln(
|
||||||
|
'[Benchmark] bytesCountPerChunk: ${Cipher.bytesCountPerChunk} bytes/chunk');
|
||||||
|
|
||||||
|
String csv = encryptionOnly
|
||||||
|
? "Run;Size (B);Encryption Time (ms)\n"
|
||||||
|
: "Run;Size (B);Encryption Time (ms);Decryption Time (ms)\n";
|
||||||
|
|
||||||
|
int run = 0;
|
||||||
var beforeBench = DateTime.now();
|
var beforeBench = DateTime.now();
|
||||||
Cipher.bytesCountPerChunk = Cipher.bytesCountPerChunk;
|
|
||||||
benchmarkStatus
|
|
||||||
.append('[Benchmark] ${Cipher.bytesCountPerChunk} bytes/chunk \n');
|
|
||||||
for (int size in testedSizes) {
|
for (int size in testedSizes) {
|
||||||
var b = Uint8List(size * 1000000);
|
run++;
|
||||||
csv += "${size * 1000000};";
|
final StringBuffer csvLine = StringBuffer();
|
||||||
|
final dummyBytes = Uint8List(size * multiplier);
|
||||||
|
csvLine.write('$run;${size * multiplier};');
|
||||||
|
|
||||||
// Encryption
|
// Encryption
|
||||||
var before = DateTime.now();
|
|
||||||
var encryptedBigFile = await cipher.encrypt(b);
|
|
||||||
var after = DateTime.now();
|
|
||||||
|
|
||||||
var benchmark =
|
|
||||||
after.millisecondsSinceEpoch - before.millisecondsSinceEpoch;
|
|
||||||
benchmarkStatus.append('[$size MB] Encryption took $benchmark ms\n');
|
|
||||||
|
|
||||||
csv += "$benchmark\n";
|
|
||||||
}
|
|
||||||
var afterBench = DateTime.now();
|
|
||||||
var benchmark =
|
|
||||||
afterBench.millisecondsSinceEpoch - beforeBench.millisecondsSinceEpoch;
|
|
||||||
var sum = testedSizes.reduce((a, b) => a + b);
|
|
||||||
benchmarkStatus.append(
|
|
||||||
'Benchmark finished.\nGenerated, and encrypted $sum MB in $benchmark ms');
|
|
||||||
debugPrint("[Benchmark cvs]\n$csv");
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _benchmark(WidgetRef ref, Cipher cipher,
|
|
||||||
{bool usePc = false}) async {
|
|
||||||
Session state = ref.read(sessionProvider.state).state;
|
|
||||||
AesGcm pc = AesGcm();
|
|
||||||
|
|
||||||
if (state.secretKey.bytes.isEmpty) {
|
|
||||||
benchmarkStatus
|
|
||||||
.print('No SecretKey!\nGo in Key tab and generate or derive one.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
benchmarkStatus.print("Benchmark 2/4/8/16/32/64/128/256MB\n");
|
|
||||||
List<int> testedSizes = [2, 4, 8, 16, 32, 64, 128, 256];
|
|
||||||
String csv = "size;encryption time;decryption time;crypto time\n";
|
|
||||||
|
|
||||||
var beforeBench = DateTime.now();
|
|
||||||
Cipher.bytesCountPerChunk = Cipher.bytesCountPerChunk;
|
|
||||||
benchmarkStatus
|
|
||||||
.append('[Benchmark] ${Cipher.bytesCountPerChunk} bytes/chunk \n');
|
|
||||||
for (int size in testedSizes) {
|
|
||||||
var b = Uint8List(size * 1000000);
|
|
||||||
csv += "${size * 1000000};";
|
|
||||||
var cryptoTime = 0;
|
|
||||||
|
|
||||||
// Encryption
|
|
||||||
var before = DateTime.now();
|
|
||||||
Object encryptedBigFile;
|
Object encryptedBigFile;
|
||||||
|
var before = DateTime.now();
|
||||||
if (usePc) {
|
if (usePc) {
|
||||||
encryptedBigFile = pc.encrypt(b, state.secretKey.bytes);
|
encryptedBigFile = pc.encrypt(dummyBytes, state.secretKey.bytes);
|
||||||
} else {
|
} else {
|
||||||
encryptedBigFile = await cipher.encrypt(b);
|
encryptedBigFile = await cipher.encrypt(dummyBytes);
|
||||||
}
|
}
|
||||||
var after = DateTime.now();
|
var after = DateTime.now();
|
||||||
|
|
||||||
var benchmark =
|
var benchmark =
|
||||||
after.millisecondsSinceEpoch - before.millisecondsSinceEpoch;
|
after.millisecondsSinceEpoch - before.millisecondsSinceEpoch;
|
||||||
benchmarkStatus.append('[$size MB] Encryption took $benchmark ms\n');
|
benchmarkStatus
|
||||||
|
.appendln('[Benchmark] ${size}MiB => Encryption took $benchmark ms');
|
||||||
csv += "$benchmark;";
|
csvLine.write('$benchmark');
|
||||||
cryptoTime += benchmark;
|
|
||||||
|
|
||||||
|
if (!encryptionOnly) {
|
||||||
// Decryption
|
// Decryption
|
||||||
before = DateTime.now();
|
before = DateTime.now();
|
||||||
if (usePc) {
|
if (usePc) {
|
||||||
@ -118,21 +89,23 @@ class BenchmarkPage extends ConsumerWidget {
|
|||||||
await cipher.decrypt(encryptedBigFile as CipherText);
|
await cipher.decrypt(encryptedBigFile as CipherText);
|
||||||
}
|
}
|
||||||
after = DateTime.now();
|
after = DateTime.now();
|
||||||
|
benchmark =
|
||||||
benchmark = after.millisecondsSinceEpoch - before.millisecondsSinceEpoch;
|
after.millisecondsSinceEpoch - before.millisecondsSinceEpoch;
|
||||||
benchmarkStatus.append('[$size MB] Decryption took $benchmark ms\n');
|
benchmarkStatus
|
||||||
|
.appendln('[Benchmark] ${size}MiB => Decryption took $benchmark ms');
|
||||||
csv += "$benchmark;";
|
csvLine.write(';$benchmark');
|
||||||
cryptoTime += benchmark;
|
}
|
||||||
csv += "$cryptoTime\n";
|
csv += csvLine.toString() + '\n';
|
||||||
}
|
}
|
||||||
var afterBench = DateTime.now();
|
var afterBench = DateTime.now();
|
||||||
var benchmark =
|
var benchmark =
|
||||||
afterBench.millisecondsSinceEpoch - beforeBench.millisecondsSinceEpoch;
|
afterBench.millisecondsSinceEpoch - beforeBench.millisecondsSinceEpoch;
|
||||||
var sum = testedSizes.reduce((a, b) => a + b);
|
var sum = testedSizes.reduce((a, b) => a + b);
|
||||||
benchmarkStatus.append(
|
benchmarkStatus
|
||||||
'Benchmark finished.\nGenerated, encrypted and decrypted $sum MB in $benchmark ms');
|
.appendln('[Benchmark] Finished: ${sum}MiB in $benchmark ms');
|
||||||
debugPrint("[Benchmark cvs]\n$csv");
|
benchmarkStatus.appendln('[Benchmark] Check the console for csv data');
|
||||||
|
benchmarkStatus.appendln(csv);
|
||||||
|
print(csv);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _clear() {
|
void _clear() {
|
||||||
@ -174,37 +147,39 @@ class BenchmarkPage extends ConsumerWidget {
|
|||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
),
|
),
|
||||||
keyContent,
|
keyContent,
|
||||||
Column(
|
Wrap(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
children: [
|
children: [
|
||||||
Button(
|
Button(
|
||||||
() => _benchmark(ref, cipher),
|
() => _benchmark(ref, cipher),
|
||||||
"NativeCrypto",
|
"NativeCrypto",
|
||||||
),
|
),
|
||||||
|
const SizedBox(width: 8),
|
||||||
Button(
|
Button(
|
||||||
() => _benchmark(ref, cipher, usePc: true),
|
() => _benchmark(ref, cipher, usePc: true),
|
||||||
"PointyCastle",
|
"PointyCastle",
|
||||||
),
|
),
|
||||||
],
|
const SizedBox(width: 8),
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
children: [
|
|
||||||
Button(
|
Button(
|
||||||
() => _benchmarkEncryptionOnly(ref, cipher),
|
() => _benchmark(ref, cipher, encryptionOnly: true),
|
||||||
"NC Persistence",
|
"NC Encryption Only",
|
||||||
),
|
),
|
||||||
|
const SizedBox(width: 8),
|
||||||
|
Button(
|
||||||
|
() => _benchmark(
|
||||||
|
ref,
|
||||||
|
cipher,
|
||||||
|
usePc: true,
|
||||||
|
encryptionOnly: true,
|
||||||
|
),
|
||||||
|
"PC Encryption Only",
|
||||||
|
),
|
||||||
|
const SizedBox(width: 8),
|
||||||
Button(
|
Button(
|
||||||
_clear,
|
_clear,
|
||||||
"Clear",
|
"Clear",
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
|
||||||
),
|
|
||||||
benchmarkStatus,
|
benchmarkStatus,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// -----
|
// -----
|
||||||
// File: output.dart
|
// File: output.dart
|
||||||
// Created Date: 28/12/2021 13:31:39
|
// Created Date: 28/12/2021 13:31:39
|
||||||
// Last Modified: 28/12/2021 14:12:11
|
// Last Modified: 25/05/2022 16:39:39
|
||||||
// -----
|
// -----
|
||||||
// Copyright (c) 2021
|
// Copyright (c) 2021
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user