<p dir="ltr">My mutable-containers package has unboxed and storable references actually.</p>
<br><div class="gmail_quote"><div dir="ltr">On Fri, Dec 11, 2015, 12:26 PM Akio Takano <<a href="mailto:tkn.akio@gmail.com">tkn.akio@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Mateusz,<br>
<br>
IORef and STRef are boxed references. That is, they are a mutable cell<br>
that contains a pointer to some immutable Haskell value. When you<br>
increment a (STRef Int), you first dereference the pointer, allocate a<br>
new immutable heap object to represent the new integer value, then<br>
mutate the reference to point to the new object. This costs much more<br>
than updating a plain mutable integer.<br>
<br>
As far as I know there is no particularly popular library that<br>
provides mutable references like this. As a workaround, you can create<br>
a 1-sized unboxed mutable vector using the vector package, and use it<br>
like a reference.<br>
<br>
On 3 December 2015 at 01:10, Mateusz Kłoczko<br>
<<a href="mailto:mateusz.p.kloczko@gmail.com" target="_blank">mateusz.p.kloczko@gmail.com</a>> wrote:<br>
> Hello!<br>
><br>
> I've performed a few simple tests using Haskell and C++ on primitives.<br>
> I've compilled all Haskell programs with -O2 optimizations, and C++ ones<br>
> with -O3<br>
> ghc version - 7.10.2, gcc version : 5.1.1<br>
><br>
> I'm sending the codes in the zip file.<br>
><br>
> Problem1 -  100 000 000  iterations.<br>
><br>
> Time of execution (in seconds):<br>
> Int  pure tail recursion: 6.911011299962411e-2<br>
> Int# pure tail recursion : 4.587398100011342e-2<br>
> IORef for loop 1.1533970820000832<br>
> IORef 'tail' recursion 1.0696569040001123<br>
> STRef for loop 1.1545546840006864<br>
> STRef tail recursion 1.1110019479992843<br>
> C++ : 2.7e-07<br>
<br>
On this one, g++ manages to eliminate the loop entirely, but GHC doesn't.<br>
<br>
><br>
> The llvm version could be as fast as C++ one in this problem.<br>
><br>
> Buuut... then there's problem 2 (using if or case) - 100 000 000 iterations:<br>
> Int# tail recursion 1.315346227000191<br>
> IORef for loop: 2.6442542390004746<br>
> STRef for loop: 2.669217500999366<br>
> C++: 0.158056<br>
><br>
><br>
> Here haskell is about 9 times slower than C++.<br>
<br>
The main difference on this comes from the fact that GHC does not<br>
optimize (n `remInt#` 2#) into (n `andI#` 1#). There is a ticket [0]<br>
that contains some discussion of this issue.<br>
<br>
[0]: <a href="https://ghc.haskell.org/trac/ghc/ticket/5615" rel="noreferrer" target="_blank">https://ghc.haskell.org/trac/ghc/ticket/5615</a><br>
<br>
Hope this helps,<br>
Takano Akio<br>
_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org" target="_blank">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users</a><br>
</blockquote></div>