all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Andrew Tropin <andrew@trop.in>
To: Maxime Devos <maximedevos@telenet.be>, 49547@debbugs.gnu.org
Subject: [bug#49547] [PATCH v2 2/4] home-services: Add home-run-on-change-service-type
Date: Thu, 15 Jul 2021 11:46:35 +0300	[thread overview]
Message-ID: <87fswg2cd0.fsf@trop.in> (raw)
In-Reply-To: <ec097a03e2df002ef04a9ad80610ed3309a8dfce.camel@telenet.be>


[-- Attachment #1.1: Type: text/plain, Size: 2261 bytes --]

Maxime Devos <maximedevos@telenet.be> writes:

> Andrew Tropin schreef op ma 05-07-2021 om 18:39 [+0300]:
>> +      (define (equal-regulars? file1 file2)
>> +        "Check if FILE1 and FILE2 are bit for bit identical."
>> +        (let* ((cmp-binary #$(file-append
>> +                              (@ (gnu packages base) diffutils) "/bin/cmp"))
>> +               (status (system* cmp-binary file1 file2)))
>> +          (= status 0)))
>
> Is there any particular reason to shell out to "cmp" instead
> of doing the comparison in Guile?  Starting a process isn't
> the most efficient thing.
>
> Try "time /run/current-system/profile/bin echo", on my system,
> it takes about 2--3 milliseconds for "echo" to finish
> even though it only had to print a newline character.
> Compare with "time echo" (to use the shell built-in "echo"),
> it takes 0.000s seconds on my system.
>
> 3 milliseconds isn't much by itself, but this can accumulate,
> so I would implement the comparison in Guile.
>
> As an optimisation, you could look at the value returned by "lstat".
> If the 'size' is different, then 'equal-regulars?' can return #f
> without reading the file.  If the 'inode' and 'device' are equal,
> then 'equal-regulars?' can return #t I think (at least on conventional
> file systems like btrfs and ext4).

No specific reason.  Yep, spawning a new process can be expensive, but
it's not clear how much time will take the comparison itself and if it
worth it to optimize "startup time". I'm not very fluent with guile
internals and not sure if reimplementation of cmp in guile would improve
or worsen the performance, but it obviously could intoduce some bugs.  I
found Xinglu's idea of the usage of well-tested cmp to be a reasonable
solution here.

Also, this service is expected to be used with small amount of files and
because many of them are symlinks to the store even smaller number of
them will trigger the execution of cmp, so I find the performance
optimization to be preliminary here and propose to address the issue
when and if it appear someday.

However, the ideas about size and inodes are good, easy to implement and
I find them potentially useful to prevent unecessary external process
spawning.  The patch with those improvements are below:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: 0001-toberebased-home-services-Prevent-unecessary-system-.patch --]
[-- Type: text/x-patch, Size: 1295 bytes --]

From 8dd0c06fb64c8b516418cbdf8c385a6c817e7f26 Mon Sep 17 00:00:00 2001
From: Andrew Tropin <andrew@trop.in>
Date: Thu, 15 Jul 2021 09:44:30 +0300
Subject: [PATCH] (toberebased) home-services: Prevent unecessary system* call

---
 gnu/home-services.scm | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/gnu/home-services.scm b/gnu/home-services.scm
index 78e5603edf..9afb70f0a7 100644
--- a/gnu/home-services.scm
+++ b/gnu/home-services.scm
@@ -341,8 +341,13 @@ with one gexp, but many times, and all gexps must be idempotent.")))
         "Check if FILE1 and FILE2 are bit for bit identical."
         (let* ((cmp-binary #$(file-append
                               (@ (gnu packages base) diffutils) "/bin/cmp"))
-               (status (system* cmp-binary file1 file2)))
-          (= status 0)))
+               (stats1     (lstat file1))
+               (stats2     (lstat file2)))
+          (cond
+           ((= (stat:ino stats1) (stat:ino stats2))         #t)
+           ((not (= (stat:size stats1) (stat:size stats2))) #f)
+
+           (else (= (system* cmp-binary file1 file2) 0)))))
 
       (define (equal-symlinks? symlink1 symlink2)
         "Check if SYMLINK1 and SYMLINK2 are pointing to the same target."
-- 
2.32.0


[-- Attachment #1.3: Type: text/plain, Size: 29 bytes --]


Thank you for suggestions!)

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 853 bytes --]

  reply	other threads:[~2021-07-15  8:49 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-05 15:35 [bug#49419] [PATCH 0/4] Essential home services Andrew Tropin
2021-07-05 15:37 ` [bug#49419] [PATCH 1/4] home-services: Add most essential " Andrew Tropin
2021-07-05 15:47   ` Maxime Devos
2021-07-05 16:19     ` Andrew Tropin
2021-07-05 19:19       ` Maxime Devos
2021-07-06  7:09         ` Andrew Tropin
2021-07-06  8:26           ` Maxime Devos
2021-07-06  7:23     ` Andrew Tropin
2021-07-05 15:39 ` [bug#49419] [PATCH 2/4] home-services: Add home-run-on-change-service-type Andrew Tropin
2021-07-05 15:41 ` [bug#49419] [PATCH 3/4] home-services: Add home-provenance-service-type Andrew Tropin
2021-07-05 15:41 ` [bug#49419] [PATCH 4/4] home-services: Add fold-home-service-types function Andrew Tropin
2021-07-13 16:17 ` [bug#49419] [PATCH v2 0/4] Essential home services Andrew Tropin
2021-07-05 15:37   ` [bug#49546] [PATCH v2 1/4] home-services: Add most essential " Andrew Tropin
     [not found]     ` <handler.49546.B.16262002971832.ack@debbugs.gnu.org>
2021-07-13 18:24       ` [bug#49546] Acknowledgement ([PATCH v2 1/4] home-services: Add most essential home services) Andrew Tropin
2021-07-05 15:39   ` [bug#49547] [PATCH v2 2/4] home-services: Add home-run-on-change-service-type Andrew Tropin
2021-07-14 10:41     ` Maxime Devos
2021-07-15  8:46       ` Andrew Tropin [this message]
2021-07-18 16:17         ` Maxime Devos
2021-07-05 15:41   ` [bug#49548] [PATCH v2 3/4] home-services: Add home-provenance-service-type Andrew Tropin
2021-07-05 15:41   ` [bug#49549] [PATCH v2 4/4] home-services: Add fold-home-service-types function Andrew Tropin
2021-07-15  9:59   ` [bug#49568] Testing reply without debbugs address Andrew Tropin
2021-07-19  8:04 ` [bug#49419] [PATCH v3 0/4] Essential home services Andrew Tropin
2021-07-05 15:37   ` [bug#49419] [PATCH v3 1/4] home-services: Add most essential " Andrew Tropin
2021-07-05 15:39   ` [bug#49419] [PATCH v3 2/4] home-services: Add home-run-on-change-service-type Andrew Tropin
2021-07-05 15:41   ` [bug#49419] [PATCH v3 3/4] home-services: Add home-provenance-service-type Andrew Tropin
2021-07-05 15:41   ` [bug#49419] [PATCH v3 4/4] home-services: Add fold-home-service-types function Andrew Tropin
2021-07-21 15:08   ` [bug#49419] [PATCH 0/4] Essential home services Ludovic Courtès
2021-07-28  5:35     ` Andrew Tropin
     [not found] ` <handler.49419.B.162549932625345.ack@debbugs.gnu.org>
2021-08-05  5:41   ` [bug#49419] [PATCH v4 " Andrew Tropin
2021-08-05  5:45     ` [bug#49419] [PATCH v4 1/4] home-services: Add most essential " Andrew Tropin
2021-08-05  5:46     ` [bug#49419] [PATCH v4 2/4] home-services: Add home-run-on-change-service-type Andrew Tropin
2021-08-05  5:46     ` [bug#49419] [PATCH v4 3/4] home-services: Add home-provenance-service-type Andrew Tropin
2021-08-05  5:47     ` [bug#49419] [PATCH v4 4/4] home-services: Add fold-home-service-types function Andrew Tropin
2021-08-23  9:57     ` [bug#49419] [PATCH v4 0/4] Essential home services Andrew Tropin
2021-08-23 16:24       ` [bug#49419] [PATCH " Oleg Pykhalov
2021-08-24  8:53         ` Andrew Tropin
2021-08-24 12:14           ` bug#49419: " Oleg Pykhalov
2021-08-26  7:01             ` [bug#49419] " Andrew Tropin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87fswg2cd0.fsf@trop.in \
    --to=andrew@trop.in \
    --cc=49547@debbugs.gnu.org \
    --cc=maximedevos@telenet.be \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.