Skip to content

Commit e3ca78e

Browse files
committed
Add sembast benchmark
1 parent 6f82286 commit e3ca78e

6 files changed

+154
-23
lines changed

.flutter-plugins-dependencies

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"shared_preferences","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/","dependencies":[]},{"name":"sqflite","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.0+3/","dependencies":[]},{"name":"sqlite3_flutter_libs","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3_flutter_libs-0.5.0/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"shared_preferences","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/","dependencies":[]},{"name":"sqflite","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.0+3/","dependencies":[]},{"name":"sqlite3_flutter_libs","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3_flutter_libs-0.5.0/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.0/","dependencies":[]},{"name":"shared_preferences_macos","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0/","dependencies":[]},{"name":"sqflite","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.0+3/","dependencies":[]},{"name":"sqlite3_flutter_libs","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3_flutter_libs-0.5.0/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/","dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0/","dependencies":["path_provider_linux"]}],"windows":[{"name":"path_provider_windows","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/","dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0/","dependencies":["path_provider_windows"]}],"web":[{"name":"shared_preferences_web","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0/","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":[]},{"name":"sqlite3_flutter_libs","dependencies":[]}],"date_created":"2021-06-20 15:33:46.175654","version":"2.2.1"}
1+
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"shared_preferences","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/","dependencies":[]},{"name":"sqflite","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.0+3/","dependencies":[]},{"name":"sqlite3_flutter_libs","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3_flutter_libs-0.5.0/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"shared_preferences","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.6/","dependencies":[]},{"name":"sqflite","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.0+3/","dependencies":[]},{"name":"sqlite3_flutter_libs","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3_flutter_libs-0.5.0/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.0/","dependencies":[]},{"name":"shared_preferences_macos","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-2.0.0/","dependencies":[]},{"name":"sqflite","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.0+3/","dependencies":[]},{"name":"sqlite3_flutter_libs","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/sqlite3_flutter_libs-0.5.0/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/","dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.0.0/","dependencies":["path_provider_linux"]}],"windows":[{"name":"path_provider_windows","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/","dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.0.0/","dependencies":["path_provider_windows"]}],"web":[{"name":"shared_preferences_web","path":"/Users/misir/Workspace/tools/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.0/","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":[]},{"name":"sqlite3_flutter_libs","dependencies":[]}],"date_created":"2021-06-20 16:24:34.979554","version":"2.2.1"}

lib/benchmark.dart

+16
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import 'dart:math';
22

33
import 'package:hive_benchmark/runners/hive.dart';
4+
import 'package:hive_benchmark/runners/sembast.dart';
45
import 'package:hive_benchmark/runners/sql_ffi.dart';
56
import 'package:hive_benchmark/runners/runner.dart';
67
import 'package:hive_benchmark/runners/shared_preferences.dart';
78
import 'package:hive_benchmark/runners/sqflite.dart';
9+
import 'package:logging/logging.dart';
810
import 'package:random_string/random_string.dart' as randStr;
911

1012
const String TABLE_NAME_STR = "kv_str";
@@ -24,6 +26,7 @@ final runners = [
2426
SqfliteRunner(),
2527
SharedPreferencesRunner(),
2628
SqlFfiRunner(),
29+
SembasRunner(),
2730
];
2831

2932
List<Result> _createResults() {
@@ -51,13 +54,18 @@ Map<String, String> generateStringEntries(int count) {
5154
return map;
5255
}
5356

57+
Logger _logger = Logger('Benchmark');
58+
5459
Future<List<Result>> benchmarkRead(int count) async {
60+
_logger.fine('Benchmarking read($count)');
61+
5562
var results = _createResults();
5663

5764
var intEntries = generateIntEntries(count);
5865
var intKeys = intEntries.keys.toList()..shuffle();
5966

6067
for (var result in results) {
68+
_logger.info('Running ${result.runner.name}...');
6169
await result.runner.setUp();
6270
await result.runner.batchWriteInt(intEntries);
6371
result.intTime = await result.runner.batchReadInt(intKeys);
@@ -67,6 +75,7 @@ Future<List<Result>> benchmarkRead(int count) async {
6775
var stringKeys = stringEntries.keys.toList()..shuffle();
6876

6977
for (var result in results) {
78+
_logger.info('Running ${result.runner.name}...');
7079
await result.runner.batchWriteString(stringEntries);
7180
result.stringTime = await result.runner.batchReadString(stringKeys);
7281
}
@@ -79,11 +88,14 @@ Future<List<Result>> benchmarkRead(int count) async {
7988
}
8089

8190
Future<List<Result>> benchmarkWrite(int count) async {
91+
_logger.fine('Benchmarking write($count)');
92+
8293
final results = _createResults();
8394
var intEntries = generateIntEntries(count);
8495
var stringEntries = generateStringEntries(count);
8596

8697
for (var result in results) {
98+
_logger.info('Running ${result.runner.name}...');
8799
await result.runner.setUp();
88100
result.intTime = await result.runner.batchWriteInt(intEntries);
89101
result.stringTime = await result.runner.batchWriteString(stringEntries);
@@ -95,11 +107,14 @@ Future<List<Result>> benchmarkWrite(int count) async {
95107
}
96108

97109
Future<List<Result>> benchmarkDelete(int count) async {
110+
_logger.fine('Benchmarking delete($count)');
111+
98112
final results = _createResults();
99113

100114
var intEntries = generateIntEntries(count);
101115
var intKeys = intEntries.keys.toList()..shuffle();
102116
for (var result in results) {
117+
_logger.info('Running ${result.runner.name}...');
103118
await result.runner.setUp();
104119
await result.runner.batchWriteInt(intEntries);
105120
result.intTime = await result.runner.batchDeleteInt(intKeys);
@@ -108,6 +123,7 @@ Future<List<Result>> benchmarkDelete(int count) async {
108123
var stringEntries = generateStringEntries(count);
109124
var stringKeys = stringEntries.keys.toList()..shuffle();
110125
for (var result in results) {
126+
_logger.info('Running ${result.runner.name}...');
111127
await result.runner.batchWriteString(stringEntries);
112128
result.stringTime = await result.runner.batchDeleteString(stringKeys);
113129
}

lib/main.dart

+31-22
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@ import 'dart:math';
33
import 'package:fl_chart/fl_chart.dart';
44
import 'package:flutter/material.dart';
55
import 'package:hive_benchmark/benchmark.dart';
6+
import 'package:logging/logging.dart';
67

7-
void main() => runApp(App());
8+
void main() {
9+
Logger.root.level = Level.ALL; // defaults to Level.INFO
10+
Logger.root.onRecord.listen((record) {
11+
print('${record.level.name}: ${record.time}: ${record.message}');
12+
});
13+
14+
runApp(App());
15+
}
816

917
class App extends StatefulWidget {
1018
@override
@@ -130,7 +138,7 @@ class _BenchmarkWidgetState extends State<BenchmarkWidget> {
130138
],
131139
),
132140
Center(
133-
child: RaisedButton(
141+
child: ElevatedButton(
134142
onPressed: !benchmarkRunning ? _performBenchmark : null,
135143
child: Text("Benchmark"),
136144
),
@@ -194,26 +202,27 @@ class BenchmarkResult extends StatelessWidget {
194202

195203
List<BarChartGroupData> get barGroups {
196204
var x = 0;
197-
return results.map((result) {
198-
return BarChartGroupData(
199-
barsSpace: 4,
200-
x: x++,
201-
barRods: [
202-
BarChartRodData(
203-
y: max(result.intTime.toDouble(), 1),
204-
colors: [leftBarColor],
205-
width: width,
206-
borderRadius: BorderRadius.circular(6),
207-
),
208-
BarChartRodData(
209-
y: max(result.stringTime.toDouble(), 1),
210-
colors: [rightBarColor],
211-
width: width,
212-
borderRadius: BorderRadius.circular(6),
213-
),
214-
],
215-
);
216-
}).toList();
205+
return [
206+
for (final result in results)
207+
BarChartGroupData(
208+
barsSpace: 4,
209+
x: x++,
210+
barRods: [
211+
BarChartRodData(
212+
y: max(result.intTime.toDouble(), 1),
213+
colors: [leftBarColor],
214+
width: width,
215+
borderRadius: BorderRadius.circular(6),
216+
),
217+
BarChartRodData(
218+
y: max(result.stringTime.toDouble(), 1),
219+
colors: [rightBarColor],
220+
width: width,
221+
borderRadius: BorderRadius.circular(6),
222+
),
223+
],
224+
),
225+
];
217226
}
218227

219228
@override

lib/runners/sembast.dart

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import 'dart:io';
2+
3+
import 'package:hive_benchmark/runners/runner.dart';
4+
import 'package:sembast/sembast.dart';
5+
import 'package:path_provider/path_provider.dart';
6+
import 'package:path/path.dart' as path;
7+
import 'package:sembast/sembast_io.dart';
8+
9+
class SembasRunner implements BenchmarkRunner {
10+
late Database db;
11+
late StoreRef store;
12+
13+
@override
14+
String get name => 'Sembast';
15+
16+
@override
17+
Future<void> setUp() async {
18+
var dir = await getApplicationDocumentsDirectory();
19+
var file = File(path.join(dir.path, 'sembast.db'));
20+
if (file.existsSync()) {
21+
await file.delete();
22+
}
23+
24+
db = await databaseFactoryIo.openDatabase(file.path);
25+
store = StoreRef.main();
26+
}
27+
28+
@override
29+
Future<void> tearDown() async {
30+
await db.close();
31+
}
32+
33+
@override
34+
Future<int> batchDeleteInt(List<String> keys) async {
35+
var s = Stopwatch()..start();
36+
await db.transaction((tx) async {
37+
for (final key in keys) {
38+
await store.record(key).delete(tx);
39+
}
40+
});
41+
s.stop();
42+
return s.elapsedMilliseconds;
43+
}
44+
45+
@override
46+
Future<int> batchDeleteString(List<String> keys) {
47+
return batchDeleteInt(keys);
48+
}
49+
50+
@override
51+
Future<int> batchReadInt(List<String> keys) async {
52+
var s = Stopwatch()..start();
53+
await db.transaction((tx) async {
54+
for (final key in keys) {
55+
await store.record(key).get(tx);
56+
}
57+
});
58+
s.stop();
59+
return s.elapsedMilliseconds;
60+
}
61+
62+
@override
63+
Future<int> batchReadString(List<String> keys) {
64+
return batchReadInt(keys);
65+
}
66+
67+
@override
68+
Future<int> batchWriteInt(Map<String, int> entries) async {
69+
var s = Stopwatch()..start();
70+
await db.transaction((tx) async {
71+
for (final key in entries.keys) {
72+
await store.record(key).put(tx, entries[key]);
73+
}
74+
});
75+
s.stop();
76+
return s.elapsedMilliseconds;
77+
}
78+
79+
@override
80+
Future<int> batchWriteString(Map<String, String> entries) async {
81+
var s = Stopwatch()..start();
82+
await db.transaction((tx) async {
83+
for (final key in entries.keys) {
84+
await store.record(key).put(tx, entries[key]);
85+
}
86+
});
87+
s.stop();
88+
return s.elapsedMilliseconds;
89+
}
90+
}

pubspec.lock

+14
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ packages:
7474
url: "https://pub.dartlang.org"
7575
source: hosted
7676
version: "0.6.3"
77+
logging:
78+
dependency: "direct main"
79+
description:
80+
name: logging
81+
url: "https://pub.dartlang.org"
82+
source: hosted
83+
version: "1.0.1"
7784
meta:
7885
dependency: transitive
7986
description:
@@ -158,6 +165,13 @@ packages:
158165
url: "https://pub.dartlang.org"
159166
source: hosted
160167
version: "2.2.0-nullsafety"
168+
sembast:
169+
dependency: "direct main"
170+
description:
171+
name: sembast
172+
url: "https://pub.dartlang.org"
173+
source: hosted
174+
version: "3.1.0+2"
161175
shared_preferences:
162176
dependency: "direct main"
163177
description:

pubspec.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ dependencies:
1818
fl_chart: ^0.36.2
1919
sqlite3: ^1.1.2
2020
sqlite3_flutter_libs: ^0.5.0
21+
sembast: ^3.1.0+2
22+
logging: ^1.0.1
2123

2224
flutter:
2325
uses-material-design: true

0 commit comments

Comments
 (0)