feat(3p/lisp/mime4cl): add benchmark script
This is far from comprehensive, mainly covering stuff I'm interested for mblog currently. I should extend it as I go. The cases I've added reveal something I've noticed recently: The worst performing part of mime4cl seems to be the initial parsing of the message. My current theory is that this is due to the use of READ-LINE in DO-MULTIPART-PARTS which seems to ultimately dispatch to READ-CHAR internally due to the way our streams are set up. We should look into fixing this soon. It may be interesting to add this to windtunnel at some point, but I'd rather not burden a runner with this given that mime4cl is only worked on once every blue moon and I'm the only user. Change-Id: I001de3aac01f8aa7ea923b43b2db29cf66a4aac3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12864 Reviewed-by: sterni <sternenseemann@systemli.org> Autosubmit: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
parent
2879969f1b
commit
bfb27b7caa
4 changed files with 100 additions and 1 deletions
30
third_party/lisp/mime4cl/benchmark/bench.lisp
vendored
Normal file
30
third_party/lisp/mime4cl/benchmark/bench.lisp
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
(defpackage :mime4cl-bench
|
||||
(:use :common-lisp :mime4cl)
|
||||
(:export :main))
|
||||
|
||||
(in-package :mime4cl-bench)
|
||||
|
||||
;; Write to /dev/null so that I/O is less (?) of a factor
|
||||
(defparameter *output-path* (pathname "/dev/null"))
|
||||
|
||||
(defun parse-message (path)
|
||||
(let ((msg (mime-message path)))
|
||||
;; to prove we are doing something, print the subject
|
||||
(format t "Subject: ~A~%" (car (mime-message-header-values "Subject" msg :decode t)))
|
||||
msg))
|
||||
|
||||
(defun main ()
|
||||
(destructuring-bind (bench-name message-path) (uiop:command-line-arguments)
|
||||
(let ((action (intern (string-upcase bench-name) :mime4cl-bench))
|
||||
(message-path (pathname message-path)))
|
||||
(ccase action
|
||||
((parse) (parse-message message-path))
|
||||
((extract) (do-parts (part (parse-message message-path))
|
||||
(format t "Content-Type: ~A~%" (mime-type-string part))
|
||||
(let ((in (mime-body-stream part)))
|
||||
(with-open-file (output-stream (pathname *output-path*)
|
||||
:direction :output
|
||||
:if-does-not-exist :create
|
||||
:element-type (stream-element-type in)
|
||||
:if-exists :overwrite)
|
||||
(redirect-stream in output-stream)))))))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue