On Mon, Sep 24, 2012 at 02:07:36PM -0600, Eric Blake wrote: > On 09/24/2012 01:53 PM, Richard W.M. Jones wrote: > > >>> + /* Search for the name in the existing environment. */ > >>> + namelen = strcspn(env, "="); > >> > >> Would 'strchr(env, '=') - env' be any more efficient? But that's a > >> micro-optimization, probably not worth worrying about. > > > > I guess I trust glibc or gcc to have these string primitives > > optimized better than I could. > > Ah, but glibc is open source, so we can check for ourselves: > > The naive C fallback when no .S is present is highly unoptimized. From > glibcc/string/strcspn.c: > > size_t > strcspn (s, reject) > const char *s; > const char *reject; > { > size_t count = 0; > > while (*s != '\0') > if (strchr (reject, *s++) == NULL) > ++count; > else > return count; > > return count; > } > > and even in the .S optimized versions, there's still no shortcuts taken > for a one-character reject (possibly worth filing a BZ about the missed > optimization, though). From glibc/sysdeps/x86_64/strcspn.S: > /* First we create a table with flags for all possible characters. > For the ASCII (7bit/8bit) or ISO-8859-X character sets which are > supported by the C string functions we have 256 characters. > Before inserting marks for the stop characters we clear the whole > table. */ > movq %rdi, %r8 /* Save value. */ > subq $256, %rsp /* Make space for 256 bytes. */ > cfi_adjust_cfa_offset(256) > movl $32, %ecx /* 32*8 bytes = 256 bytes. */ > movq %rsp, %rdi > xorl %eax, %eax /* We store 0s. */ > ... > > That is, you are definitely wasting time pre-computing the reject table, > compared to doing a strchr() for the one rejection. Possibly, if we weren't just about to spend 100000 cycles doing a fork. Now, a project to rewrite all Python utilities in Linux in a compiled high-level language like OCaml, there's something I could get behind :-) -*- Unfortunately this patch does not fix the bug, but it now fails in a different, and stranger way: libvir: error : libvirtd quit during handshake: Input/output error In this code: if ((rv = saferead(cmd->handshakeNotify[0], &c, sizeof(c))) != sizeof(c)) { if (rv < 0) virReportSystemError(errno, "%s", _("Unable to wait on parent process")); else virReportSystemError(EIO, "%s", _("libvirtd quit during handshake")); return -1; } Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list