From: "Torsten Bögershausen" <tboegi@web.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Torsten Bögershausen" <tboegi@web.de>,
git@vger.kernel.org,
"Linus Torvalds" <torvalds@linux-foundation.org>,
"Ralf Thielow" <ralf.thielow@gmail.com>
Subject: Re: [PATCH v2] macos: lazily initialize iconv
Date: Fri, 10 Aug 2012 18:43:10 +0200 [thread overview]
Message-ID: <50253A1E.20706@web.de> (raw)
In-Reply-To: <7v1ujrkc9p.fsf@alter.siamese.dyndns.org>
On 31.07.12 20:37, Junio C Hamano wrote:
> In practice, the majority of paths do not have utf8 that needs
> the canonicalization. Lazily call iconv_open()/iconv_close() to
> avoid unnecessary overhead.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> Helped-by: Ralf Thielow <ralf.thielow@gmail.com>
> Helped-by: Linus Torvalds <torvalds@linux-foundation.org>
> ---
>
> * This is not even compile tested, so it needs testing and
> benchmarking, as I do not even know how costly the calls to
> open/close are when we do not have to call iconv() itself.
>
> This reroll corrects an obvious thinko pointed out by Ralf, and
> gets rid of an extra iconv_opened field added unnecessarily in
> the previous round.
>
> This was brought up by Linus in http://goo.gl/INWVc
>
> compat/precompose_utf8.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c
> index d40d1b3..79b5528 100644
> --- a/compat/precompose_utf8.c
> +++ b/compat/precompose_utf8.c
> @@ -67,7 +67,7 @@ void probe_utf8_pathname_composition(char *path, int len)
>
> void precompose_argv(int argc, const char **argv)
> {
> - int i = 0;
> + int i;
> const char *oldarg;
> char *newarg;
> iconv_t ic_precompose;
> @@ -75,11 +75,19 @@ void precompose_argv(int argc, const char **argv)
> if (precomposed_unicode != 1)
> return;
>
> + /* Avoid iconv_open()/iconv_close() if there is nothing to convert */
> + for (i = 0; i < argc; i++) {
> + if (has_utf8(argv[i], (size_t)-1, NULL))
> + break;
> + }
> + if (argc <= i)
> + return; /* no utf8 found */
> +
> ic_precompose = iconv_open(repo_encoding, path_encoding);
> if (ic_precompose == (iconv_t) -1)
> return;
>
> - while (i < argc) {
> + for (i = 0; i < argc; i++) {
> size_t namelen;
> oldarg = argv[i];
> if (has_utf8(oldarg, (size_t)-1, &namelen)) {
> @@ -87,7 +95,6 @@ void precompose_argv(int argc, const char **argv)
> if (newarg)
> argv[i] = newarg;
> }
> - i++;
> }
> iconv_close(ic_precompose);
> }
> @@ -106,8 +113,7 @@ PREC_DIR *precompose_utf8_opendir(const char *dirname)
> return NULL;
> } else {
> int ret_errno = errno;
> - prec_dir->ic_precompose = iconv_open(repo_encoding, path_encoding);
> - /* if iconv_open() fails, die() in readdir() if needed */
> + prec_dir->ic_precompose = (iconv_t)-1;
> errno = ret_errno;
> }
>
> @@ -136,6 +142,9 @@ struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *prec_dir)
> prec_dir->dirent_nfc->d_type = res->d_type;
>
> if ((precomposed_unicode == 1) && has_utf8(res->d_name, (size_t)-1, NULL)) {
> + if (prec_dir->ic_precompose == (iconv_t)-1)
> + prec_dir->ic_precompose =
> + iconv_open(repo_encoding, path_encoding);
> if (prec_dir->ic_precompose == (iconv_t)-1) {
> die("iconv_open(%s,%s) failed, but needed:\n"
> " precomposed unicode is not supported.\n"
Hi Junio,
thanks for the optimization.
Tested-by: Torsten Bögershausen <tboegi@web.de>
We can optimize the optimization with another 0.01 % ;-)
diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c
index 79b5528..93ae5de 100644
--- a/compat/precompose_utf8.c
+++ b/compat/precompose_utf8.c
@@ -112,9 +112,7 @@ PREC_DIR *precompose_utf8_opendir(const char *dirname)
free(prec_dir);
return NULL;
} else {
- int ret_errno = errno;
prec_dir->ic_precompose = (iconv_t)-1;
- errno = ret_errno;
}
next prev parent reply other threads:[~2012-08-10 16:43 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-31 17:52 [PATCH] macos: lazily initialize iconv Junio C Hamano
2012-07-31 18:07 ` Junio C Hamano
2012-07-31 18:10 ` Ralf Thielow
2012-07-31 18:19 ` Junio C Hamano
2012-07-31 18:37 ` [PATCH v2] " Junio C Hamano
2012-07-31 18:55 ` Ralf Thielow
2012-07-31 19:00 ` Junio C Hamano
2012-07-31 19:51 ` Linus Torvalds
2012-07-31 20:16 ` Junio C Hamano
2012-07-31 20:39 ` Linus Torvalds
2012-08-01 19:25 ` Torsten Bögershausen
2012-08-10 16:43 ` Torsten Bögershausen [this message]
2012-08-10 18:18 ` Junio C Hamano
2012-08-10 21:11 ` Torsten Bögershausen
2012-08-10 21:47 ` Junio C Hamano
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=50253A1E.20706@web.de \
--to=tboegi@web.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=ralf.thielow@gmail.com \
--cc=torvalds@linux-foundation.org \
/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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).