<div dir="ltr">You have typo in your code. Set on tuple can't be as fast as your measure :)<br>You do get on Extensible array and tuple instead of set and you call this inside set cycle which remove data structure away.<br>
<br>It should be:<br><br><span style="font-family: courier new,monospace;">test(N) -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     %% fixed-size array</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     {G1, _} = timer:tc(arr, get, [{arr, array_get}, data1(N), N]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     {S1, _} = timer:tc(arr, set, [{arr, array_set}, data1(N), N]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     %% extensible array</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     {G2, _} = timer:tc(arr, get, [{arr, array_get}, data2(N), N]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     {S2, _} = timer:tc(arr, set, [{arr, array_set}, data2(N), N]), % <-- here</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     %% tuple</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     {G3, _} = timer:tc(arr, get, [{arr, tuple_get}, data3(N), N]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     {S3, _} = timer:tc(arr, set, [{arr, tuple_set}, data3(N), N]), % <-- here</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     %% results</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     io:format("Fixed-size array: get: ~8wns, set: ~8wns~n", [G1 , S1]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     io:format("Extensible array: get: ~8wns, set: ~8wns~n", [G2 , S2]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     io:format("Tuple:            get: ~8wns, set: ~8wns~n", [G3 , S3]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
     ok.</span><br><br>And you should gain very different result looks like (Debian Linux 2.2GHz Intel C2Duo Erlang/OTP R12B-3):<br><br><span style="font-family: courier new,monospace;">6> arr:test().</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Fixed-size array: get:     8912ns, set:    29114ns</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Extensible array: get:     8639ns, set:    15065ns</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Tuple:            get:     1244ns, set:   233815ns</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">ok</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">7> arr:test(100000).</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Fixed-size array: get:    78370ns, set:   110003ns</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Extensible array: get:    29618ns, set:   110906ns</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Tuple:            get:    12458ns, set: 27852761ns</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">ok</span><br style="font-family: courier new,monospace;"><br>Tuple set is far slower and get is far faster than on array operation as expected.<br>There is possible GC issue why Extensible array is slower than fixed. Try run it in opposite order and you will see.<br>
<br><span style="font-family: courier new,monospace;">11> arr:test(100000).</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Fixed-size array: get:    29036ns, set:   103593ns</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Extensible array: get:    89132ns, set:   114022ns</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Tuple:            get:    12471ns, set: 28103959ns</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">ok</span><br><br>Writing worth benchmark is not as simple as it looks ;-)<br><br><div class="gmail_quote">On Mon, Aug 25, 2008 at 5:47 PM, Joel Reymont <span dir="ltr"><<a href="mailto:joelr1@gmail.com">joelr1@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d"><br>
On Aug 25, 2008, at 3:56 PM, Dimitry Golubovsky wrote:<br>
<br>
> Joel,<br>
><br>
> If nobody did it before, then I'll do (not earlier than tonight<br>
> anyway ;)<br>
<br>
<br>
</div>Here, check out the performance of fixed-size vs extensible array set<br>
op.<br>
<br>
Astounding!<br>
<br>
---<br>
<br>
Mac OSX Leopard 10.5.4<br>
<br>
Mac Pro 2x2.8Ghz Quad-Core Intel Xeon, 14Gb 800Mhz DDR2 FB-DIMM<br>
<br>
Erlang (BEAM) emulator version 5.6.3 [source] [64-bit] [smp:8] [async-<br>
threads:0] [kernel-poll:false]<br>
<br>
%% 10K elements<br>
<br>
14> arr:test().<br>
Fixed-size array: get:     1256ns, set:     6667ns<br>
Extensible array: get:     1255ns, set:       22ns<br>
Tuple:            get:      659ns, set:        6ns<br>
ok<br>
<br>
%% 1 million<br>
<br>
15> arr:test(1000000).<br>
Fixed-size array: get:   121881ns, set:   777067ns<br>
Extensible array: get:   120026ns, set:       35ns<br>
Tuple:            get:    66288ns, set:       40ns<br>
ok<br>
<br>
---<br>
<br>
-module(arr).<br>
<br>
-compile([export_all]).<br>
<br>
data1(N) -><br>
     %% size implies fixed-size array<br>
     %% but lets be explicit<br>
     array:new([{size, N}, {default, 0}, {fixed, true}]).<br>
<br>
data2(N) -><br>
     %% extensible array<br>
     array:new([{size, N}, {default, 0}, {fixed, false}]).<br>
<br>
data3(N) -><br>
     erlang:make_tuple(N, 0).<br>
<br>
array_set(Array, I, Value) -><br>
     %% array indexing starts at 0<br>
     array:set(I - 1, Value, Array).<br>
<br>
tuple_set(Tuple, I, Value) -><br>
     %% tuple indexing starts at 1<br>
     setelement(I, Tuple, Value).<br>
<br>
array_get(Array, I) -><br>
     array:get(I - 1, Array).<br>
<br>
tuple_get(Tuple, I) -><br>
     element(I, Tuple).<br>
<br>
get(_, _, 0) -><br>
     ok;<br>
<br>
get(Fun, Data, N) -><br>
     Fun(Data, N),<br>
     get(Fun, Data, N - 1).<br>
<br>
set(_, _, 0) -><br>
     ok;<br>
<br>
set(Fun, Data, N) -><br>
     Data1 = Fun(Data, N, N),<br>
     set(Fun, Data1, N - 1).<br>
<br>
test() -><br>
     test(10000).<br>
<br>
test(N) -><br>
     %% fixed-size array<br>
     {G1, _} = timer:tc(arr, get, [{arr, array_get}, data1(N), N]),<br>
     {S1, _} = timer:tc(arr, set, [{arr, array_set}, data1(N), N]),<br>
     %% extensible array<br>
     {G2, _} = timer:tc(arr, get, [{arr, array_get}, data2(N), N]),<br>
     {S2, _} = timer:tc(arr, set, [{arr, array_get}, data2(N), N]),<br>
     %% tuple<br>
     {G3, _} = timer:tc(arr, get, [{arr, tuple_get}, data3(N), N]),<br>
     {S3, _} = timer:tc(arr, set, [{arr, tuple_get}, data3(N), N]),<br>
     %% results<br>
     io:format("Fixed-size array: get: ~8wns, set: ~8wns~n", [G1 , S1]),<br>
     io:format("Extensible array: get: ~8wns, set: ~8wns~n", [G2 , S2]),<br>
     io:format("Tuple:            get: ~8wns, set: ~8wns~n", [G3 , S3]),<br>
     ok.<br>
<font color="#888888"><br>
<br>
<br>
--<br>
<a href="http://wagerlabs.com" target="_blank">wagerlabs.com</a><br>
</font><div><div></div><div class="Wj3C7c"><br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>--Hynek (Pichi) Vychodil<br>
</div>