Commit 545019d4 authored by  Hayley Patton's avatar Hayley Patton 🐢

Use our own output buffer macro to speed up rendering

parent d218449f
(in-package :netfarm)
(defun make-output-vector (parts position)
(let ((output-vector (make-array position
:element-type '(unsigned-byte 8)))
(start 0))
(declare (optimize (speed 3) (safety 0))
(fixnum start))
(loop for part of-type (simple-array (unsigned-byte 8) (*))
in (reverse parts)
do (loop for output-position of-type fixnum from start
for input-position of-type fixnum below (length part)
for byte = (aref part input-position)
do (setf (aref output-vector output-position) byte))
(incf start (length part)))
(defmacro with-output-to-vector ((function-name) &body body)
(alexandria:with-gensyms (parts position)
`(let ((,parts '())
(,position 0))
(declare (fixnum ,position))
(flet ((,function-name (vector)
(declare ((simple-array (unsigned-byte 8) (*)) vector))
(push vector ,parts)
(incf ,position (length vector))))
(make-output-vector ,parts ,position)))))
(in-package :netfarm) (in-package :netfarm)
(declaim (inline write-type-tag write-integer)
(optimize (speed 3)))
(defun write-type-tag (tag function)
(let ((v (make-array 1 :element-type '(unsigned-byte 8))))
(setf (aref v 0) tag)
(funcall function v)
(defun write-integer (integer function) (defun write-integer (integer function)
(let ((byte-count (ceiling (integer-length integer) 8))) (let ((byte-count (ceiling (integer-length integer) 8)))
(assert (< byte-count 256)) (assert (< byte-count 256))
(flet ((get-byte (n) (write-type-tag byte-count function)
(ldb (byte 8 (* n 8)) integer))) (loop with buffer = (make-array byte-count
(funcall function (vector byte-count)) :element-type '(unsigned-byte 8))
(loop with buffer = (make-array byte-count for byte-position from (1- byte-count) downto 0
:element-type '(unsigned-byte 8)) for step = integer then (ash step -8)
for byte-position from (1- byte-count) downto 0 do (setf (aref buffer byte-position)
for buffer-position from 0 (logand step #xFF))
do (setf (aref buffer buffer-position) finally (funcall function buffer))))
(get-byte byte-position))
finally (funcall function buffer)))))
(defun write-type-tag (tag function)
(funcall function (vector tag)))
(defgeneric binary-render-to-function (object function) (defgeneric binary-render-to-function (object function)
(:method ((s string) function) (:method ((s string) function)
...@@ -128,18 +131,16 @@ ...@@ -128,18 +131,16 @@
(defun binary-render (object &optional function) (defun binary-render (object &optional function)
(if (null function) (if (null function)
(flexi-streams:with-output-to-sequence (s) (with-output-to-vector (f)
(binary-render-to-function object (lambda (bytes) (binary-render-to-function object #'f))
(write-sequence bytes s))))
(binary-render-to-function object function))) (binary-render-to-function object function)))
(defun binary-render-object (object &key function (defun binary-render-object (object &key function
(emit-computed-values t) (emit-computed-values t)
(emit-signatures t)) (emit-signatures t))
(if (null function) (if (null function)
(flexi-streams:with-output-to-sequence (s) (with-output-to-vector (f)
(binary-render-object-to-function object (lambda (bytes) (binary-render-object-to-function object #'f
(write-sequence bytes s))
emit-computed-values emit-computed-values
emit-signatures)) emit-signatures))
(binary-render-object-to-function object function (binary-render-object-to-function object function
...@@ -49,8 +49,9 @@ ...@@ -49,8 +49,9 @@
(:file "new-renderer"))) (:file "new-renderer")))
(:module "Binary-format" (:module "Binary-format"
:depends-on ("Objects") :depends-on ("Objects")
:components ((:file "parser") :components ((:file "fasterer-output")
(:file "renderer"))) (:file "parser")
(:file "renderer" :depends-on ("fasterer-output"))))
(:module "Crypto" (:module "Crypto"
:depends-on ("Binary-format") :depends-on ("Binary-format")
:serial t :serial t
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment