~ruther/guix-local

be4e38fb6f8f2da9de4f9c6ff9e448a9dc178c8d — Ludovic Courtès 12 years ago 2c6b7c7
derivations: Micro-optimize 'derivation'.

* guix/derivations.scm (derivation->string): New procedure.
  (derivation-hash, derivation): Use it.
  Memoization here yields a 5% improvement on "guix build -e '(@ (gnu
  packages emacs) emacs)' -n --no-substitutes".
1 files changed, 10 insertions(+), 5 deletions(-)

M guix/derivations.scm
M guix/derivations.scm => guix/derivations.scm +10 -5
@@ 435,6 435,14 @@ that form."
                 port)
     (display ")" port))))

(define derivation->string
  (memoize
   (lambda (drv)
     "Return the external representation of DRV as a string."
     (with-fluids ((%default-port-encoding "UTF-8"))
       (call-with-output-string
        (cut write-derivation drv <>))))))

(define* (derivation->output-path drv #:optional (output "out"))
  "Return the store path of its output OUTPUT."
  (let ((outputs (derivation-outputs drv)))


@@ 517,9 525,7 @@ in SIZE bytes."
         ;; the SHA256 port's `write' method gets called for every single
         ;; character.
         (sha256
          (with-fluids ((%default-port-encoding "UTF-8"))
            (string->utf8 (call-with-output-string
                           (cut write-derivation drv <>)))))))))))
          (string->utf8 (derivation->string drv)))))))))

(define (store-path type hash name)               ; makeStorePath
  "Return the store path for NAME/HASH/TYPE."


@@ 685,8 691,7 @@ derivations where the costs of data transfers would outweigh the benefits."
         (drv        (add-output-paths drv-masked)))

    (let ((file (add-text-to-store store (string-append name ".drv")
                                   (call-with-output-string
                                    (cut write-derivation drv <>))
                                   (derivation->string drv)
                                   (map derivation-input-path
                                        inputs))))
      (set-file-name drv file))))