HEADS DOWN
Sean C. Farley
sean-freebsd at farley.org
Fri May 11 23:20:16 UTC 2007
On Fri, 11 May 2007, Maxime Henrion wrote:
> Sean C. Farley wrote:
<snip of *env discussion>
>> In an attempt to make strlen() faster, I wrote a new strlen()[2] that
>> performs a trick to boost performance by searching by word then by
>> byte within a word to find the NUL byte. It did not compare to the
>> speed of the built-in strlen() in GCC, but it is twice as fast as
>> lib/libc/string/strlen.c. It was hard to really compare due to the
>> built-in code as well as what __pure does. __pure seemed to make all
>> versions the same speed. At some times, I really did not know for
>> certain which version (assembly, builtin, original, new) of strlen()
>> I was testing. :)
>
> Just for the record, __attribute__((pure)) tells GCC that the
> function's return value solely depends on the parameters passed in
> (and possibly global memory). That is, if you call such a function
> several times providing the same parameters for each call, and if it
> is clear that no global memory can have changed in between, then you
> are guaranteed to get back the same result, and the compiler can
> safely get rid of some calls and enable some more optimizations.
>
> There is also __attribute__((const)) which basically is like pure
> except that the function isn't allowed to read global memory, and thus
> even more calls can be removed. I think we export this one as __pure2
> in FreeBSD.
>
> Note that strlen() isn't 'const' because it's passed char pointers so
> you could call it two times passing the same pointers, but the memory
> they are pointing to may have changed in between. So strlen() is only
> 'pure'.
>
> For the interested reader, your functions always have these properties
> in a pure functional programming language, which allows the compiler
> to do some really neat tricks such as caching the result of functions
> to avoid evaluating them again (memoization).
That is interesting. Compiler optimizations sure have changed a lot
while I was not looking.
Please correct me if I am wrong: programs compiled by GCC on FreeBSD
use the builtin strlen() unless told not. If builtin strlen() is
disabled, i386 will use the assembly version while all other platforms
use the C version. Regardless of the version, __pure is taken into
account.
It seems that __attribute__((pure)) is not supported by the Intel
compiler. Would my strlen() be of any use when libc is compiled with
it?
Sean
--
sean-freebsd at farley.org
More information about the freebsd-arch
mailing list