[erlang-questions] Speeding up text file I/O
Dmitrii 'Mamut' Dimandt
dmitriid@REDACTED
Tue Jan 8 10:39:25 CET 2008
Per Gustafsson wrote:
> Christian S wrote:
>> Do you know if this has been benchmarked against the more attractive
>> code
>> that R12B makes more efficient? Because those functions make me want to
>> change profession to something where you get to hurt people.
>>
>
>
>
> I found that the following function is about 10% faster then the
> unrolled function when using BEAM R12B:
>
> find_8(Buffer, Char, Pos) ->
> case Buffer of
> << Char, _/bits >> -> Pos;
> << _, Rest/bits >> ->
> find_8(Rest, Char, Pos+1);
> _ ->
> not_found
> end.
>
> It might depend a little on the input though and when both functions
> were native compiled there was no major difference between them.
>
> Per
Here's the reply:
"""start quote""
This is incorrect. My unrolled function is twice as fast as the
one-liner when it is compiled with the native flag (I didn't translate
the flag part - my bad, D.) The number of lines has been carefully
measured through various tests.
Without the native flag there shouldn't be a significant difference in
speed. That's because unrolling only helps the machine code for
superpiplined processors. Since the VM isn't superpiplined there's not
much point in unrolling the loop
The only simplification that can be done for R12 is:
find_8( Buffer, Char, Pos ) ->
case Buffer of
<< Char:8, _/bytes >> -> Pos;
<< _:1/bytes, Char:8, _/bytes >> -> Pos + 1;
<< _:2/bytes, Char:8, _/bytes >> -> Pos + 2;
...
<< _:32/bytes, Rest/bytes >> -> find_8( Rest, Char, Pos + 32 );
_ -> not_found
end.
That's it.
"""end quote"""
Sorry for missing the "compile with the native flag" in my translation
More information about the erlang-questions
mailing list