objectbox / flatbuffers-benchmark

Testing the FlatBuffers performance of different programming languages

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FlatBuffers performance comparison

This repository comes with benchmarking code for different FlatBuffer implementations across programing languages.

Setup

  • Benchmarks are CPU bound (no disk operations).
  • Executed on a laptop CPU: Intel Core i7-8850H
  • Dart uses JIT unless AOT is indicated.
  • Dart benchmark_harness executes a 10-call timing loop repeatedly until 2 seconds have elapsed. The reported result is the average of the runtimes.
  • Measured performance is in "operations per second": (10 * 1e6 / timeUs)

Results (more is better)

Date Variant Read Write Read (w.bytes) Write (w.bytes)
2021-12-12 Dart official FB v2.0.5 11 636 660 7 907 070 9 185 325 6 176 130
2021-07-06 Dart official FB master 8 470 985 4 063 437 4 029 197 3 036 950
2021-07-06 Dart ObjectBox v1.1 FB 11 296 765 8 904 645 5 989 820 6 517 266
2021-02-26 Dart official FB v0.12 8 197 200 13 060 3 831 742 12 178
2021-02-26 Dart official FB master 8 878 415 3 284 045 4 032 722 2 592 991
2021-02-26 Dart ObjectBox v0.12 FB 9 074 660 5 044 802 4 732 340 4 212 460
2021-02-26 Dart AOT ObjectBox v0.12 FB 8 149 270 3 821 181 5 020 220 3 189 186
2021-02-26 Go 9 920 634 7 806 401 8 438 818 7 032 348

Note about results with a byte list: when reading a list from FlatBuffers in Dart, we call toList() to complete detach from the buffer (do not reference data inside the buffer). To be fair/have the numbers for comparison, we do the same in Go, though it doesn't have such a big impact there.

Benchmarked on 2021-12-12

  • Dart SDK v2.13.4
  • Dart flat_buffers v2.0.5
$ dart run ./benchmark/flatbuffers_official.dart
Measuring performance without byte list
Builder(RunTime): 1.264690966438896 us.
Reader(RunTime): 0.8593531133503943 us.
Measuring performance with byte list
Builder(RunTime): 1.6191369028825495 us.
Reader(RunTime): 1.0886931055787357 us.

Benchmarked on 2021-07-06

  • Dart SDK v2.13.4
  • Dart objectbox/flatbuffers fork - from objectbox-dart v1.1.0
  • Dart flat_buffers master (as of 2012-07-06)
  • Null safety enabled (no noticable performance improvement for this change alone)

Notes:

  • read speed up by about 10 % was done by improving the benchmark to use const constructors of FB readers.
  • both upstream master and ObjectBox FlatBuffers are now null-safe.
$ dart run ./benchmark/flatbuffers_official.dart
Measuring performance without byte list
Builder(RunTime): 2.4609702616502274 us.
Reader(RunTime): 1.1805002605954324 us.
Measuring performance with byte list
Builder(RunTime): 3.2927768109833697 us.
Reader(RunTime): 2.481883500446739 us.

$ dart run ./benchmark/flatbuffers_objectbox.dart
Measuring performance without byte list
Builder(RunTime): 1.123009326587794 us.
Reader(RunTime): 0.8852091727144895 us.
Measuring performance with byte list
Builder(RunTime): 1.5343855632803305 us.
Reader(RunTime): 1.6694992503948365 us.

Benchmarked on 2021-02-26 and before

  • Dart SDK v2.10.5 (FlatBuffers)
  • Dart SDK v2.12.0 (ObjectBox FlatBuffers)
  • Dart flat_buffers v1.12.0
  • Dart flat_buffers master (as of 2012-02-26) with some performance-related PRs we've got merged upstream
  • Dart objectbox/flatbuffers fork - from objectbox-dart v0.12.0
  • Go version go1.15.8
  • Go flatbuffers v1.12.0

Dart JIT

# v0.12
$ pub run benchmark/flatbuffers_official.dart
Measuring performance without byte list
Builder(RunTime): 765.6720244929201 us.
Reader(RunTime): 1.2199287561606402 us.
Measuring performance with byte list
Builder(RunTime): 821.0898645876077 us.
Reader(RunTime): 2.6097788216872186 us.

# master
$ pub run benchmark/flatbuffers_official.dart
Measuring performance without byte list
Builder(RunTime): 3.0450252660971455 us.
Reader(RunTime): 1.1263271653780544 us.
Measuring performance with byte list
Builder(RunTime): 3.856550051195625 us.
Reader(RunTime): 2.4797140891084815 us.

$ pub run benchmark/flatbuffers_objectbox.dart
Measuring performance without byte list
Builder(RunTime): 1.9822381638140623 us.
Reader(RunTime): 1.1019696605713052 us.
Measuring performance with byte list
Builder(RunTime): 2.3739097819326473 us.
Reader(RunTime): 2.113119513813462 us.

Dart AOT

We measured only the fastest variant (ObjectBox fork):

$ dart2native benchmark/flatbuffers_objectbox.dart --output bench && ./bench
Generated: /flatbuffers_benchmark/flatbuffers_dart_benchmark/bench
Measuring performance without byte list
Builder(RunTime): 2.616991849387036 us.
Reader(RunTime): 1.227103777393558 us.
Measuring performance with byte list
Builder(RunTime): 3.1355955587468918 us.
Reader(RunTime): 1.9919445761341137 us.

Go plain results

To get (closer) to what Dart does: execute 10 iterations of the same operation for each measured loop.

$ go test -bench .
goos: linux
goarch: amd64
pkg: flatbuffers_go_benchmark
BenchmarkBuilderWithoutBytesList-12       928960              1281 ns/op
BenchmarkReaderWithoutBytesList-12       1226929              1008 ns/op
BenchmarkBuilderWithBytesList-12          819072              1422 ns/op
BenchmarkReaderWithBytesList-12          1000000              1185 ns/op

About

Testing the FlatBuffers performance of different programming languages

License:Apache License 2.0


Languages

Language:Dart 69.7%Language:Go 30.3%