<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
<br>I don't see such behavior neither.<div>ubuntu 12.10, ghc 7.4.2.</div><div><br></div><div>Perhaps this has to do with how malloc allocates /cache</div><div>behavior. If you try not to allocate array rather use existing&nbsp;</div><div>one perhaps there would be no inconsistency?</div><div>It looks to me that's about CPU cache&nbsp;performance.</div><div><br></div><div>Branimir</div><div><br><div><div id="SkyDrivePlaceholder"></div>&gt; <br>&gt; I'm using GHC 7.4.2 on x86_64 openSUSE Linux, kernel 2.6.37.6. <br>&gt; <br>&gt; Janek<br>&gt; <br>&gt; Dnia piątek, 23 listopada 2012, Edward Z. Yang napisał:<br>&gt; &gt; Running the sample code on GHC 7.4.2, I don't see the "one<br>&gt; &gt; fast, rest slow" behavior.  What version of GHC are you running?<br>&gt; &gt;<br>&gt; &gt; Edward<br>&gt; &gt;<br>&gt; &gt; Excerpts from Janek S.'s message of Fri Nov 23 13:42:03 -0500 2012:<br>&gt; &gt; &gt; &gt; What happens if you do the benchmark without unsafePerformIO involved?<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; I removed unsafePerformIO, changed copy to have type Vector Double -&gt; IO<br>&gt; &gt; &gt; (Vector Double) and modified benchmarks like this:<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; bench "C binding" $ whnfIO (copy signal)<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; I see no difference - one benchmark runs fast, remaining ones run slow.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; Janek<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; Excerpts from Janek S.'s message of Fri Nov 23 10:44:15 -0500 2012:<br>&gt; &gt; &gt; &gt; &gt; I am using Criterion library to benchmark C code called via FFI<br>&gt; &gt; &gt; &gt; &gt; bindings and I've ran into a problem that looks like a bug.<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt; The first benchmark that uses FFI runs correctly, but subsequent<br>&gt; &gt; &gt; &gt; &gt; benchmarks run much longer. I created demo code (about 50 lines,<br>&gt; &gt; &gt; &gt; &gt; available at github: https://gist.github.com/4135698 ) in which C<br>&gt; &gt; &gt; &gt; &gt; function copies a vector of doubles. I benchmark that function a<br>&gt; &gt; &gt; &gt; &gt; couple of times. First run results in avarage time of about 17us,<br>&gt; &gt; &gt; &gt; &gt; subsequent runs take about 45us. In my real code additional time was<br>&gt; &gt; &gt; &gt; &gt; about 15us and it seemed to be a constant factor, not relative to<br>&gt; &gt; &gt; &gt; &gt; "correct" run time. The surprising thing is that if my C function<br>&gt; &gt; &gt; &gt; &gt; only allocates memory and does no copying:<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt; double* c_copy( double* inArr, int arrLen ) {<br>&gt; &gt; &gt; &gt; &gt;   double* outArr = malloc( arrLen * sizeof( double ) );<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt;   return outArr;<br>&gt; &gt; &gt; &gt; &gt; }<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt; then all is well - all runs take similar amount of time. I also<br>&gt; &gt; &gt; &gt; &gt; noticed that sometimes in my demo code all runs take about 45us, but<br>&gt; &gt; &gt; &gt; &gt; this does not seem to happen in my real code - first run is always<br>&gt; &gt; &gt; &gt; &gt; shorter.<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt; Does anyone have an idea what is going on?<br>&gt; &gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; &gt; Janek<br>&gt; <br>&gt; <br>&gt; <br>&gt; _______________________________________________<br>&gt; Haskell-Cafe mailing list<br>&gt; Haskell-Cafe@haskell.org<br>&gt; http://www.haskell.org/mailman/listinfo/haskell-cafe<br></div></div>                                               </div></body>
</html>