This is the mail archive of the cygwin-patches mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: avoid calling strlen() twice in readlink()


Corinna Vinschen wrote:
On Mar 8 08:29, Eric Blake wrote:
On 03/08/2012 06:37 AM, VÃclav Zeman wrote:
Hi.

Here is a tiny patch to avoid calling strlen() twice in readlink().


- ssize_t len = min (buflen, strlen (pathbuf.get_win32 ())); + size_t pathbuf_len = strlen (pathbuf.get_win32 ()); + size_t len = MIN (buflen, pathbuf_len); memcpy (buf, pathbuf.get_win32 (), len);
For that matter, is calling pathbuf.get_win32() twice worth factoring out?
It's just a const char *pointer, and it's an inline method.  I'm pretty
sure the compiler will optimize this just fine.



Yes - and it does ever more:
strlen() is one of the compiler builtins declared with a const attribute internally. Then gcc optimizes duplicate calls away.


Testcase:

$ cat opt.cc
#include <string.h>

class X {
  const char * p;
  public:
    X();
    const char * get() { return p; }
};

int f(X & x)
{
  int i = 0;
  i += strlen(x.get());
  i += strlen(x.get());
  i += strlen(x.get());
  i += strlen(x.get());
  i += strlen(x.get());
  return i;
}

int g(X & x)
{
  return 5 * strlen(x.get());
}


$ gcc -S -O2 -fomit-frame-pointer opt.cc


$ cat opt.s | c++filt
...
f(X&):
        subl    $28, %esp
        movl    32(%esp), %eax
        movl    (%eax), %eax
        movl    %eax, (%esp)
        call    _strlen
        addl    $28, %esp
        leal    (%eax,%eax,4), %eax
        ret
...
g(X&):
        subl    $28, %esp
        movl    32(%esp), %eax
        movl    (%eax), %eax
        movl    %eax, (%esp)
        call    _strlen
        addl    $28, %esp
        leal    (%eax,%eax,4), %eax
        ret

(interesting: With -O1 it uses an inline version of strlen, with -O2,3,... it doesn't)


So this patch probably had no effect at all, sorry :-)


Christian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]