[erlang-questions] Strange performance issue - advice needed
Ian
hobson42@REDACTED
Sat Apr 14 21:56:06 CEST 2012
Thanks Tim,
Before you posted I had tried a version that wrote each word to the file
as it arrived. That took 3550 seconds!
So I rewrote the code as below and it runs in 800ms at 50 chars line
length and 769ms for 200 chars per line - much better and more the
relationship I expected. Thanks for your helpful input.
But, my goodness, so called buffered file IO is inexpressibly crap!
Regards
Ian
On 14/04/2012 18:14, Gmail wrote:
> Can't read the code well on my phone but if you're using line oriented io then that tends to suck.
>
> I would suggest reading http://erlang.org/pipermail/erlang-questions/2012-March/065374.html as well.
>
> Cheers,
> Tim
>
Replacement code - smaller and 20 times faster (and needs a bit more RAM).
-module(tgpack).
-export([pack/2]).
%% tgpack - read words, builds and write lines to FileName,
%% where lines are as long as possible and less than Length
pack(Length,FileName) ->
file:write_file(FileName, buildlist(Length,0,[])).
% buildList
% Length is max length of line
% Size is length of line so far
% List is list of binaries built up so far, in reverse order
buildlist(Length,Size,List) ->
receive
<<>> ->
lists:reverse(List);
Word ->
S = Size + 1 + byte_size(Word), % length of current line
if S >= Length -> % start new line
buildlist(Length,byte_size(Word),[Word|[<<"\n">>|List]]);
true ->
buildlist(Length,S,[Word|[<<" ">>|List]])
end
end.
More information about the erlang-questions
mailing list