[erlang-questions] Deforesting tuple updates

Per Gustafsson <>
Thu Feb 22 17:41:01 CET 2007


Joel Reymont wrote:
> I don't think it works for floats or doubles. It's just bytes or  
> fixnums if I remember it correctly.
> 
> On Feb 22, 2007, at 3:32 PM, Daniel Luna wrote:
> 
> 
>>As long as the values in the array are simple terms, you can use  
>>hipe_bifs:bytearray/2.
> 
> 
> --
> http://wagerlabs.com/
> 
> 
> 
> 
> 
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions

You could use this code:

-module(floats).

-export([new/1,update/3,sum/1,
	new2/1,update2/3,sum2/1,
	test/0]).

new(N) ->
   hipe_bifs:bytearray(N*8,0).

update(Arr,N,Float) ->
   <<A1,A2,A3,A4,A5,A6,A7,A8>> = <<Float/float>>,
   Start=N*8,
   hipe_bifs:bytearray_update(Arr,Start,A1),
   hipe_bifs:bytearray_update(Arr,Start+1,A2),
   hipe_bifs:bytearray_update(Arr,Start+2,A3),
   hipe_bifs:bytearray_update(Arr,Start+3,A4),
   hipe_bifs:bytearray_update(Arr,Start+4,A5),
   hipe_bifs:bytearray_update(Arr,Start+5,A6),
   hipe_bifs:bytearray_update(Arr,Start+6,A7),
   hipe_bifs:bytearray_update(Arr,Start+7,A8).

sum(Bin) ->
   sum(Bin,0.0).

sum(<<Float/float,Rest/binary>>, Acc) ->
   sum(Rest,Float+Acc);
sum(<<>>,Acc) -> Acc.

Performance is not that great, about 4-5 times faster updates than 
gb_trees for arrays of 100000 floats, and summing is slower.

Per



More information about the erlang-questions mailing list