+ (context-coloring-benchmark-series
+ (cdr sequence)
+ callback))))))))
+
+(defun context-coloring-benchmark-mapc (sequence iteratee callback)
+ "For each element in SEQUENCE, call ITERATEE, finally call
+CALLBACK. ITERATEE is passed the current element and a callback
+for it to call when it is done."
+ (cond
+ ((null sequence)
+ (funcall callback))
+ (t
+ (funcall
+ iteratee
+ (car sequence)
+ (lambda ()
+ (context-coloring-benchmark-next-tick
+ (lambda ()
+ (context-coloring-benchmark-mapc
+ (cdr sequence)
+ iteratee
+ callback))))))))
+
+(defun context-coloring-benchmark-log-results (result-file fixture statistics)
+ "Log benchmarking results to RESULT-FILE for fixture FIXTURE
+with STATISTICS."
+ (let ((results (prog1
+ (progn
+ (elp-results)
+ (buffer-substring-no-properties (point-min) (point-max)))
+ (kill-buffer))))
+ (make-directory (context-coloring-benchmark-resolve-path "./logs") t)
+ (append-to-file
+ (with-temp-buffer
+ (goto-char (point-min))
+ (insert (format "For fixture \"%s\":\n" fixture))
+ (insert "\n")
+ (insert "General statistics:\n")
+ (insert (format "File size: %s bytes\n" (plist-get statistics :file-size)))
+ (insert (format "Lines: %s\n" (plist-get statistics :lines)))
+ (insert (format "Words: %s\n" (plist-get statistics :words)))
+ (insert (format "Colorization times: %s\n"
+ (context-coloring-join
+ (mapcar (lambda (number)
+ (format "%.4f" number))
+ (plist-get statistics :colorization-times)) ", ")))
+ (insert (format "Average colorization time: %.4f\n"
+ (plist-get statistics :average-colorization-time)))
+ (insert "\n")
+ (insert "Function statistics:\n")
+ (insert "(Function Name / Call Count / Elapsed Time / Average Time):\n")
+ (insert results)
+ (insert "\n")
+ (buffer-substring-no-properties (point-min) (point-max)))
+ nil result-file)))
+
+(defun context-coloring-benchmark (title setup teardown fixtures callback)