perf: track tx-log entry count in a field instead of length per append
ober
ac7064f7a02a10a5f71ef5d31f8b328ac11bf00c
--- a/lib/jerboa-db/tx-log.ss +++ b/lib/jerboa-db/tx-log.ss @@ -120,6 +120,7 @@ segment-dir ;; directory for segment files (or #f for in-memory) segment-size ;; max entries per segment (mutable current-segment-count) ;; entries in current segment + (mutable entry-count) ;; total entries (avoids O(n) length per append) mutex)) (def (new-tx-log . opts) @@ -131,7 +132,7 @@ (<= seg-size +tx-log-max-segment-size+)) (error 'new-tx-log "invalid transaction log segment size" seg-size)) (make-tx-log '() (checked-tx-log-dir dir 'new-tx-log) - seg-size 0 (make-mutex)))) + seg-size 0 0 (make-mutex)))) ;; ---- Append ---- @@ -145,6 +146,7 @@ (write-entry-to-segment! log entry)) ;; Prepend to in-memory list (tx-log-entries-set! log (cons entry (tx-log-entries log))) + (tx-log-entry-count-set! log (+ (tx-log-entry-count log) 1)) (tx-log-current-segment-count-set! log (+ (tx-log-current-segment-count log) 1)) ;; Rotate after the durable append and in-memory publication. @@ -191,7 +193,7 @@ (def (tx-log-count log) (with-mutex (tx-log-mutex log) - (length (tx-log-entries log)))) + (tx-log-entry-count log))) (def (tx-log-latest-tx log) (with-mutex (tx-log-mutex log) @@ -261,8 +263,8 @@ (def (write-entry-to-segment! log entry) (let* ([dir (tx-log-segment-dir log)] - [segment-num (quotient (length (tx-log-entries log)) - (tx-log-segment-size log))] + [segment-num (quotient (tx-log-entry-count log) + (tx-log-segment-size log))] [path (checked-segment-path dir (string-append "segment-" (number->string segment-num) ".fasl") 'tx-log-append!)]) @@ -371,6 +373,8 @@ (vector-ref v 2))]) (tx-log-entries-set! log (cons entry (tx-log-entries log))) + (tx-log-entry-count-set! log + (+ (tx-log-entry-count log) 1)) (loop))))))) (lambda () (close-port port)))))