summaryrefslogtreecommitdiff
path: root/tests/test-lorem-optimum-benchmark.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-11-14 02:31:16 -0600
committerCraig Jennings <c@cjennings.net>2025-11-14 02:31:16 -0600
commit9d55ed149e100b4fb3ef6f5a79d263dcb26ce835 (patch)
treeb02a77b84849f15b4302fda8f3f8e3942cb253ac /tests/test-lorem-optimum-benchmark.el
parent7b982b1984dd37af42a2dfc9f4c3e52b27102860 (diff)
checking in modified/removed tests and other misc changes
Diffstat (limited to 'tests/test-lorem-optimum-benchmark.el')
-rw-r--r--tests/test-lorem-optimum-benchmark.el223
1 files changed, 0 insertions, 223 deletions
diff --git a/tests/test-lorem-optimum-benchmark.el b/tests/test-lorem-optimum-benchmark.el
deleted file mode 100644
index 57d5ae5f..00000000
--- a/tests/test-lorem-optimum-benchmark.el
+++ /dev/null
@@ -1,223 +0,0 @@
-;;; test-lorem-optimum-benchmark.el --- Performance tests for lorem-optimum.el -*- lexical-binding: t; -*-
-
-;;; Commentary:
-;; Benchmark and performance tests for the Markov chain implementation.
-;;
-;; These tests measure:
-;; - Learning time scaling with input size
-;; - Multiple learning operations (exposes key rebuild overhead)
-;; - Generation time scaling
-;; - Memory usage (hash table growth)
-;;
-;; Performance baseline targets (on modern hardware):
-;; - Learn 1000 words: < 10ms
-;; - Learn 10,000 words: < 100ms
-;; - 100 learn operations of 100 words each: < 500ms (current bottleneck!)
-;; - Generate 100 words: < 5ms
-
-;;; Code:
-
-(require 'ert)
-(require 'testutil-general)
-
-;; Add modules directory to load path
-(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
-
-;; Load the module
-(require 'lorem-optimum)
-
-;;; Benchmark Helpers
-
-(defun benchmark-time (func)
- "Time execution of FUNC and return milliseconds."
- (let ((start (current-time)))
- (funcall func)
- (let ((end (current-time)))
- (* 1000.0 (float-time (time-subtract end start))))))
-
-(defun generate-test-text (word-count)
- "Generate WORD-COUNT words of test text with some repetition."
- (let ((words '("lorem" "ipsum" "dolor" "sit" "amet" "consectetur"
- "adipiscing" "elit" "sed" "do" "eiusmod" "tempor"
- "incididunt" "ut" "labore" "et" "dolore" "magna" "aliqua"))
- (result '()))
- (dotimes (i word-count)
- (push (nth (mod i (length words)) words) result)
- (when (zerop (mod i 10))
- (push "." result)))
- (mapconcat #'identity (nreverse result) " ")))
-
-(defun benchmark-report (name time-ms)
- "Report benchmark NAME with TIME-MS."
- (message "BENCHMARK [%s]: %.2f ms" name time-ms))
-
-;;; Learning Performance Tests
-
-(ert-deftest benchmark-learn-1k-words ()
- "Benchmark learning 1000 words."
- (let* ((text (generate-test-text 1000))
- (chain (cj/markov-chain-create))
- (time (benchmark-time
- (lambda () (cj/markov-learn chain text)))))
- (benchmark-report "Learn 1K words" time)
- (should (< time 50.0)))) ; Should be < 50ms
-
-(ert-deftest benchmark-learn-10k-words ()
- "Benchmark learning 10,000 words.
-DISABLED: Takes too long (minutes instead of seconds).
-Needs lorem-optimum performance optimization before re-enabling."
- :tags '(:slow)
- (let* ((text (generate-test-text 10000))
- (chain (cj/markov-chain-create))
- (time (benchmark-time
- (lambda () (cj/markov-learn chain text)))))
- (benchmark-report "Learn 10K words" time)
- (should (< time 500.0)))) ; Should be < 500ms
-
-(ert-deftest benchmark-learn-100k-words ()
- "Benchmark learning 100,000 words (stress test)."
- :tags '(:slow)
- (let* ((text (generate-test-text 100000))
- (chain (cj/markov-chain-create))
- (time (benchmark-time
- (lambda () (cj/markov-learn chain text)))))
- (benchmark-report "Learn 100K words" time)
- ;; This may be slow due to key rebuild
- (message "Hash table size: %d bigrams"
- (hash-table-count (cj/markov-chain-map chain)))))
-
-;;; Multiple Learning Operations (Exposes Quadratic Behavior)
-
-(ert-deftest benchmark-multiple-learns-10x100 ()
- "Benchmark 10 learn operations of 100 words each."
- (let ((chain (cj/markov-chain-create))
- (times '()))
- (dotimes (i 10)
- (let* ((text (generate-test-text 100))
- (time (benchmark-time
- (lambda () (cj/markov-learn chain text)))))
- (push time times)))
- (let ((total (apply #'+ times))
- (avg (/ (apply #'+ times) 10.0))
- (max-time (apply #'max times)))
- (benchmark-report "10x learn 100 words - TOTAL" total)
- (benchmark-report "10x learn 100 words - AVG" avg)
- (benchmark-report "10x learn 100 words - MAX" max-time)
- (message "Times: %S" (nreverse times))
- ;; Note: Watch if later operations are slower (quadratic behavior)
- (should (< total 100.0))))) ; Total should be < 100ms
-
-(ert-deftest benchmark-multiple-learns-100x100 ()
- "Benchmark 100 learn operations of 100 words each (key rebuild overhead)."
- :tags '(:slow)
- (let ((chain (cj/markov-chain-create))
- (times '())
- (measurements '()))
- (dotimes (i 100)
- (let* ((text (generate-test-text 100))
- (time (benchmark-time
- (lambda () (cj/markov-learn chain text)))))
- (push time times)
- ;; Sample measurements every 10 iterations
- (when (zerop (mod i 10))
- (push (cons i time) measurements))))
- (let ((total (apply #'+ times))
- (avg (/ (apply #'+ times) 100.0))
- (first-10-avg (/ (apply #'+ (last times 10)) 10.0))
- (last-10-avg (/ (apply #'+ (seq-take times 10)) 10.0)))
- (benchmark-report "100x learn 100 words - TOTAL" total)
- (benchmark-report "100x learn 100 words - AVG" avg)
- (benchmark-report "100x learn - First 10 AVG" first-10-avg)
- (benchmark-report "100x learn - Last 10 AVG" last-10-avg)
- (message "Sampled times (iteration, ms): %S" (nreverse measurements))
- (message "Hash table size: %d bigrams"
- (hash-table-count (cj/markov-chain-map chain)))
- ;; This exposes the quadratic behavior: last operations much slower
- (when (> last-10-avg (* 2.0 first-10-avg))
- (message "WARNING: Learning slows down significantly over time!")
- (message " First 10 avg: %.2f ms" first-10-avg)
- (message " Last 10 avg: %.2f ms" last-10-avg)
- (message " Ratio: %.1fx slower" (/ last-10-avg first-10-avg))))))
-
-;;; Generation Performance Tests
-
-(ert-deftest benchmark-generate-100-words ()
- "Benchmark generating 100 words."
- (let* ((text (generate-test-text 1000))
- (chain (cj/markov-chain-create)))
- (cj/markov-learn chain text)
- (let ((time (benchmark-time
- (lambda () (cj/markov-generate chain 100)))))
- (benchmark-report "Generate 100 words" time)
- (should (< time 30.0))))) ; Should be < 30ms
-
-;;; Tokenization Performance Tests
-
-(ert-deftest benchmark-tokenize-10k-words ()
- "Benchmark tokenizing 10,000 words.
-DISABLED: Takes too long (minutes instead of seconds).
-Needs lorem-optimum performance optimization before re-enabling."
- :tags '(:slow)
- (let* ((text (generate-test-text 10000))
- (time (benchmark-time
- (lambda () (cj/markov-tokenize text)))))
- (benchmark-report "Tokenize 10K words" time)
- (should (< time 50.0)))) ; Tokenization should be fast
-
-;;; Memory/Size Tests
-
-(ert-deftest benchmark-chain-growth ()
- "Measure hash table growth with increasing input."
- (let ((chain (cj/markov-chain-create))
- (sizes '()))
- (dolist (word-count '(100 500 1000 5000 10000))
- (let ((text (generate-test-text word-count)))
- (cj/markov-learn chain text)
- (let ((size (hash-table-count (cj/markov-chain-map chain))))
- (push (cons word-count size) sizes)
- (message "After %d words: %d unique bigrams" word-count size))))
- (message "Growth pattern: %S" (nreverse sizes))))
-
-;;; Comparison: Tokenization vs Learning
-
-(ert-deftest benchmark-tokenize-vs-learn ()
- "Compare tokenization time to total learning time."
- (let* ((text (generate-test-text 5000))
- (tokenize-time (benchmark-time
- (lambda () (cj/markov-tokenize text))))
- (chain (cj/markov-chain-create))
- (learn-time (benchmark-time
- (lambda () (cj/markov-learn chain text)))))
- (benchmark-report "Tokenize 5K words" tokenize-time)
- (benchmark-report "Learn 5K words (total)" learn-time)
- (message "Tokenization is %.1f%% of total learning time"
- (* 100.0 (/ tokenize-time learn-time)))))
-
-;;; Real-world Scenario
-
-(ert-deftest benchmark-realistic-usage ()
- "Benchmark realistic usage: learn from multiple sources, generate paragraphs."
- (let ((chain (cj/markov-chain-create))
- (learn-total 0.0)
- (gen-total 0.0))
- ;; Simulate learning from 10 different sources
- (dotimes (i 10)
- (let ((text (generate-test-text 500)))
- (setq learn-total
- (+ learn-total
- (benchmark-time (lambda () (cj/markov-learn chain text)))))))
-
- ;; Generate 5 paragraphs
- (dotimes (i 5)
- (setq gen-total
- (+ gen-total
- (benchmark-time (lambda () (cj/markov-generate chain 50))))))
-
- (benchmark-report "Realistic: 10 learns (500 words each)" learn-total)
- (benchmark-report "Realistic: 5 generations (50 words each)" gen-total)
- (benchmark-report "Realistic: TOTAL TIME" (+ learn-total gen-total))
- (message "Final chain size: %d bigrams"
- (hash-table-count (cj/markov-chain-map chain)))))
-
-(provide 'test-lorem-optimum-benchmark)
-;;; test-lorem-optimum-benchmark.el ends here