branch: elpa/flx commit 4c67675437e9c2e338f091322bb967ba93f2d86d Author: Le Wang <le.w...@agworld.com.au> Commit: Le Wang <le.w...@agworld.com.au>
add GC tuning information to README --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/README.md b/README.md index b6c1eeb3e5..f1b3e5bc26 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,61 @@ It's unlikely to crash your Emacs, but do expect to encounter bugs. [Screencast showing rationale and ido workflow][] +# Memory Usage + +The flx algorithm willingly sacrifices memory usage for speed. + +For 10k file names, about 10 MB of memory will be used to speed up future +matching. This memory is never released to keep the match speed fast. + +So far with modern computers, this feels like a reasonable design decision. + +It may change in future. + + +# GC Optimization + +Emacs garbage collector is fairly primitive stop the world type. GC time can +contribute significantly to the run-time of computation that allocates and +frees a lot of memory. + +Consider: + + (defun uuid () + (format "%08x-%08x-%08x-%08x" + (random (expt 16 4)) + (random (expt 16 4)) + (random (expt 16 4)) + (random (expt 16 4)))) + + (benchmark-run 1 + (let ((cache (flx-make-filename-cache))) + (dolist (i (number-sequence 0 10000)) + (flx-process-cache (uuid) cache)))) + ;;; ⇒ (0.899678 9 0.33650300000000044) + +This means that roughly 30% of time is spent just doing garbage-collection. + +`flx` can benefit significantly from garbage collection tuning. + +By default Emacs will initiate GC every 0.76 MB allocated (`gc-cons-threshold` +== 800000). If we increase this to 20 MB (`gc-cons-threshold` == 20000000) + +We get: + + (benchmark-run 1 + (setq gc-cons-threshold 20000000) + (let ((cache (flx-make-filename-cache))) + (dolist (i (number-sequence 0 10000)) + (flx-process-cache (uuid) cache)))) + ;;; ⇒ (0.62035 1 0.05461100000000041) + +So if you have a modern machine, I encourage you to add + + (setq gc-cons-threshold 20000000) + +to your init file. + # ido support Add this to your init file and *flx* match will be enabled for ido.