Merge branch 'benchmark'

This commit is contained in:
Daniel Eklöf 2020-05-31 13:17:26 +02:00
commit bb79d8a8c4
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 99 additions and 1 deletions

View file

@ -33,7 +33,7 @@ The fast, lightweight and minimalistic Wayland terminal emulator.
## Features
* Fast
* Fast (see [benchmarks](doc/benchmark.md))
* Lightweight, in dependencies, on-disk and in-memory
* Wayland native
* DE agnostic

47
doc/benchmark.md Normal file
View file

@ -0,0 +1,47 @@
# Benchmarks
## vtebench
All benchmarks are done using [vtebench](https://github.com/alacritty/vtebench):
```sh
vtebench -h $(tput lines) -w $(tput cols) -b 104857600 alt-screen-random-write > ~/alt-random
vtebench -c -h $(tput lines) -w $(tput cols) -b 104857600 alt-screen-random-write > ~/alt-random-colors
vtebench -h $(tput lines) -w $(tput cols) -b 10485760 scrolling > ~/scrolling
vtebench -h $(tput lines) -w $(tput cols) -b 104857600 scrolling --fill-lines > ~/scrolling-filled-lines
vtebench -h $(tput lines) -w $(tput cols) -b 10485760 unicode-random-write > ~/unicode-random
```
They were "executed" using [benchmark.py](../scripts/benchmark.py),
which will load each file into memory, and then print it to the
terminal. This is done **20** times for each test. Then it calculates
the _mean_ and _standard deviation_ for each test.
## 2020-05-31
### System
CPU: i5-8250U
RAM: 8GB RAM
Graphics: Intel UHD Graphcis 620
### Terminal configuration
Geometry: 953x1023
Font: Dina:pixelsize=12
scrollback=10000
| Benchmark | Foot (GCC+PGO) | Alacritty | URxvt | St | XTerm |
|------------------------|---------------:|--------------:|---------------:|--------------:|--------------:|
| alt-random | 0.791s ±0.080 | 1.558s ±0.038 | 1.746s ±0.065 | 2.628s ±0.085 | 1.706s ±0.064 |
| alt-random-colors | 0.830s ±0.076 | 1.587s ±0.041 | 2.049s ±0.118 | 3.033s ±0.129 | 2.109s ±0.131 |
| scrolling | 1.603s ±0.070 | 1.464s ±0.098 | 1.439s ±0.035 | 3.760s ±0.113 | 1.459s ±0.036 |
| scrolling-filled-lines | 1.888s ±0.021 | 2.334s ±0.078 | 2.145s ±0.074 | 3.372s ±0.078 | 2.144s ±0.091 |
| unicode-random | 1.545s ±0.229 | 0.164s ±0.012 | 11.180s ±0.342 | crashed |11.389s ±0.269 |

51
scripts/benchmark.py Executable file
View file

@ -0,0 +1,51 @@
#!/usr/bin/env -S python3 -u
import argparse
import fcntl
import os
import statistics
import struct
import sys
import termios
from datetime import datetime
def main():
parser = argparse.ArgumentParser()
parser.add_argument('files', type=argparse.FileType('rb'), nargs='+')
parser.add_argument('--iterations', type=int, default=20)
args = parser.parse_args()
lines, cols, height, width = struct.unpack(
'HHHH',
fcntl.ioctl(sys.stdout.fileno(),
termios.TIOCGWINSZ,
struct.pack('HHHH', 0, 0, 0, 0)))
times = {name: [] for name in [f.name for f in args.files]}
for f in args.files:
bench_bytes = f.read()
for i in range(args.iterations):
start = datetime.now()
sys.stdout.buffer.write(bench_bytes)
stop = datetime.now()
times[f.name].append((stop - start).total_seconds())
del bench_bytes
print('\033[J')
print(times)
print(f'cols={cols}, lines={lines}, width={width}px, height={height}px')
for f in args.files:
print(f'{os.path.basename(f.name)}: '
f'{statistics.mean(times[f.name]):.3f}s '
f'±{statistics.stdev(times[f.name]):.3f}')
if __name__ == '__main__':
sys.exit(main())