summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2014-10-13 23:07:47 +0200
committerLudovic Courtès <ludo@gnu.org>2014-10-13 23:34:09 +0200
commit998fb8fa1d6dfe64a0662aeaeb1ce7169b90dd57 (patch)
tree0fafb96367e836dc570815b38551f03b3db485d7
parent8601d0ddcf5f0c1123d7679924560bc1b6b0e846 (diff)
downloadguix-998fb8fa1d6dfe64a0662aeaeb1ce7169b90dd57.tar.gz
utils: Micro-optimize 'bytevector->base16-string'.
This reduces run time of (package-derivation s emacs) by ~1.5%.

* guix/utils.scm (bytevector->base16-string): Traverse BV from the end
  so as to use 'string-concatenate' instead of
  'string-concatenate-reverse'.
-rw-r--r--guix/utils.scm11
1 files changed, 6 insertions, 5 deletions
diff --git a/guix/utils.scm b/guix/utils.scm
index 2814247a68..6392914845 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -121,12 +121,13 @@ evaluate to a simple datum."
                                                     0))))
                                     v))))))
     (define chars base16-chars)
-    (let loop ((i 0)
+    (let loop ((i len)
                (r '()))
-      (if (= i len)
-          (string-concatenate-reverse r)
-          (loop (+ 1 i)
-                (cons (vector-ref chars (bytevector-u8-ref bv i)) r))))))
+      (if (zero? i)
+          (string-concatenate r)
+          (let ((i (- i 1)))
+            (loop i
+                  (cons (vector-ref chars (bytevector-u8-ref bv i)) r)))))))
 
 (define base16-string->bytevector
   (let ((chars->value (fold (lambda (i r)