<div dir="ltr">The main problem is the behaviour of dict:append/3. From documentation:<div><br></div><div>For example append/3 could be defined as:<div><br></div><div>append(Key, Val, D) -></div><div>    update(Key, fun (Old) -> Old ++ [Val] end, [Val], D).</div></div><div><br></div><div>dict module is implemented in pure erlang which means Old ++ [Val] is what exactly happens behind. When Old part is growing it becomes the problem due its quadratic complexity. The solution is use dict:update/4 in the way:</div><div><br></div><div><div>preppend(Key, Val, D) -></div><div>    dict:update(Key, fun (Old) -> [Val|Old] end, [Val], D).</div></div><div><br></div><div>With this fix, it is around 24 times faster on mine computer. <a href="https://github.com/andreaferretti/kmeans/pull/14">https://github.com/andreaferretti/kmeans/pull/14</a></div><div><br></div><div>Faster process dictionary version is available at <a href="https://github.com/pichi/kmeans/tree/proc_dict">https://github.com/pichi/kmeans/tree/proc_dict</a></div><div>It is not good practice but can be an inspiration how to write fast code when there is not other option like NIF, C-port or C-node.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 24, 2015 at 9:40 AM, Andrea Peruffo <span dir="ltr"><<a href="mailto:andrea.peruffo1982@gmail.com" target="_blank">andrea.peruffo1982@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div>This:<br><a href="https://github.com/andreaferretti/kmeans" target="_blank">https://github.com/andreaferretti/kmeans</a><br></div>is a benchmark of different languages on a kmeans clustering algo.<br><br></div>I made an implementation of it but is terribly slow...<br><br></div>A question is about the data structure "dict" I used, is that the proper use case or there is anything better?<br></div>I have checked with "ets" but looks even slower...<br></div><br></div>Is there anything wrong with the provided implementation?<br><br></div>Thanks in advance.<br><div><div><br><div><div><div><br></div></div></div></div></div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>