[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
03/06: serialization: 'read-byte-string' makes a single read(2) call.
From: |
guix-commits |
Subject: |
03/06: serialization: 'read-byte-string' makes a single read(2) call. |
Date: |
Fri, 24 Jan 2020 18:16:26 -0500 (EST) |
civodul pushed a commit to branch master
in repository guix.
commit 01e5d63c87b6b110f0632597e89a6a7476fc7d1c
Author: Ludovic Courtès <address@hidden>
AuthorDate: Fri Jan 24 22:39:47 2020 +0100
serialization: 'read-byte-string' makes a single read(2) call.
On "guix build libreoffice -nd", this reduces the number of read(2)
system calls from 10,434 to 8092.
* guix/serialization.scm (sub-bytevector): New procedure.
(read-byte-string): Make a single 'get-bytevector-n*' call and use
'sub-bytevector'.
---
guix/serialization.scm | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/guix/serialization.scm b/guix/serialization.scm
index 9452303..836ad06 100644
--- a/guix/serialization.scm
+++ b/guix/serialization.scm
@@ -27,6 +27,7 @@
#:use-module ((ice-9 rdelim) #:prefix rdelim:)
#:use-module (ice-9 match)
#:use-module (ice-9 ftw)
+ #:use-module (system foreign)
#:export (write-int read-int
write-long-long read-long-long
write-padding
@@ -80,6 +81,17 @@
(port port)))))
bv))
+(define (sub-bytevector bv len)
+ "Return a bytevector that aliases the first LEN bytes of BV."
+ (define max (bytevector-length bv))
+ (cond ((= len max) bv)
+ ((< len max)
+ ;; Yes, this is safe because the result of each conversion procedure
+ ;; has its life cycle synchronized with that of its argument.
+ (pointer->bytevector (bytevector->pointer bv) len))
+ (else
+ (error "sub-bytevector called to get a super bytevector"))))
+
(define (write-int n p)
(let ((b (make-bytevector 8 0)))
(bytevector-u32-set! b 0 n (endianness little))
@@ -119,10 +131,9 @@
(define (read-byte-string p)
(let* ((len (read-int p))
(m (modulo len 8))
- (bv (get-bytevector-n* p len)))
- (or (zero? m)
- (get-bytevector-n* p (- 8 m)))
- bv))
+ (pad (if (zero? m) 0 (- 8 m)))
+ (bv (get-bytevector-n* p (+ len pad))))
+ (sub-bytevector bv len)))
(define (read-string p)
(utf8->string (read-byte-string p)))
- branch master updated (2aa1e76 -> 0ef7e44), guix-commits, 2020/01/24
- 01/06: ui: Do not display error messages with bare format strings., guix-commits, 2020/01/24
- 03/06: serialization: 'read-byte-string' makes a single read(2) call.,
guix-commits <=
- 05/06: gnu: python-pygments: Update to 2.5.2., guix-commits, 2020/01/24
- 02/06: guix build, archive, graph: Disable absolute file port name canonicalization., guix-commits, 2020/01/24
- 06/06: gnu: httpie: Update to 2.0.0., guix-commits, 2020/01/24
- 04/06: gnu: guile-ics: Add "guile3.0-ics" variant., guix-commits, 2020/01/24