aboutsummaryrefslogtreecommitdiffstats
path: root/misc
diff options
context:
space:
mode:
authorGravatar lvgx <l@vgx.fr>2020-08-21 04:45:45 +0200
committerGravatar GitHub <noreply@github.com>2020-08-21 08:15:45 +0530
commitbcbe8080be6610c265bcbc28879502cd9ab72bfc (patch)
tree572fea1129649f326eb082ecb704cba1db9018cf /misc
parentd37356a9362d24436f27bad34219755e7e79642a (diff)
downloadnnn-bcbe8080be6610c265bcbc28879502cd9ab72bfc.tar.gz
Add support for Alexey Tourbin's QSORT code (#708)
* Add support for Alexey Tourbin's QSORT code See https://github.com/svpv/qsort * Add benchmark scripts and compilation mode Compile with `make O_BENCHMARK=1`, and run benchmarks with e.g.: ./misc/test/benchmark.sh ./nnn '/' '/usr/bin' '/usr/lib' > benchdata You can then plot basic violin graphs with: ./misc/test/plot-bench.py benchdata * Update style, doc, haiku support, fix lint
Diffstat (limited to 'misc')
-rw-r--r--misc/haiku/Makefile10
-rwxr-xr-xmisc/test/benchmark.sh37
-rwxr-xr-xmisc/test/plot-bench.py20
3 files changed, 67 insertions, 0 deletions
diff --git a/misc/haiku/Makefile b/misc/haiku/Makefile
index 34057df..6ab4544 100644
--- a/misc/haiku/Makefile
+++ b/misc/haiku/Makefile
@@ -18,6 +18,8 @@ O_NOBATCH := 0 # no built-in batch renamer
O_NOFIFO := 0 # no FIFO previewer support
O_CTX8 := 0 # enable 8 contexts
O_ICONS := 0 # support icons
+O_QSORT := 0 # use Alexey Tourbin's QSORT implementation
+O_BENCH := 0 # benchmark mode (stops at first user input)
# convert targets to flags for backwards compatibility
ifneq ($(filter debug,$(MAKECMDGOALS)),)
@@ -74,6 +76,14 @@ ifeq ($(O_ICONS),1)
CPPFLAGS += -DICONS
endif
+ifeq ($(O_QSORT),1)
+ CPPFLAGS += -DTOURBIN_QSORT
+endif
+
+ifeq ($(O_BENCH),1)
+ CPPFLAGS += -DBENCH
+endif
+
ifeq ($(shell $(PKG_CONFIG) ncursesw && echo 1),1)
CFLAGS_CURSES ?= $(shell $(PKG_CONFIG) --cflags ncursesw)
LDLIBS_CURSES ?= $(shell $(PKG_CONFIG) --libs ncursesw)
diff --git a/misc/test/benchmark.sh b/misc/test/benchmark.sh
new file mode 100755
index 0000000..fb56d01
--- /dev/null
+++ b/misc/test/benchmark.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Usage: ./misc/test/benchmark.sh ./nnn /tmp/testdir1 ./testdir2 ...
+#
+# Don't forget to build nnn in benchmark mode: make O_BENCH=1
+
+# Use a test dir filled with genfiles.sh to get interesting output
+# (or maybe /usr/lib/)
+
+LANG=C
+
+TIME_VAL=${TIME_VAL:-"real"}
+
+SAMPLES=${SAMPLES:-100}
+
+EXE=$1
+
+bench_val () {
+ (time "$1" "$2") 2>&1 |\
+ awk '$1=="'"$TIME_VAL"'"{match($2, /[0-9]*\.[0-9]*/) ; print substr($2, RSTART, RLENGTH)}'
+}
+
+bench_dir () {
+ i=$SAMPLES
+ printf "$2"
+ while [ $((i--)) -gt 0 ] ; do
+ printf "\t%s" "$(bench_val "$1" "$2")"
+ done
+ printf "\n"
+}
+
+shift
+
+for dir in "$@" ; do
+ bench_dir "$EXE" "$dir"
+done
+
diff --git a/misc/test/plot-bench.py b/misc/test/plot-bench.py
new file mode 100755
index 0000000..b708fec
--- /dev/null
+++ b/misc/test/plot-bench.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+#
+# Usage: ./plot-bench.py datafile
+# (where datafile is the output of benchmark.sh)
+
+import matplotlib.pyplot as plt
+import sys
+
+def bench_file_to_lists(infile):
+ return [[float(entry) for entry in line.split('\t')[1:]] for line in infile.readlines()]
+
+def plot_data(data):
+ fig = plt.figure()
+ ax = fig.add_axes([0,0,1,1])
+ ax.violinplot(data)
+ plt.savefig("plot.svg")
+
+filename = sys.argv[1]
+
+plot_data(bench_file_to_lists(open(filename)))