<HTML><BODY>Thank you! Now it's rather clear for me.<br><br><br>Mon, 4 Aug 2014 06:47:34 +0100 от Matthew Flatt <mflatt@cs.utah.edu>:<br>
<blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">
        <div id="">
        



    









        
        


        
        
        
        
        

        
        

        
        



<div class="js-helper js-readmsg-msg">
        <style type="text/css"></style>
        <div>
                <base target="_self" href="https://e.mail.ru/">
                
                        <div id="style_14071312640000000402_BODY">Well... a function call is expensive relative to some things, such as<br>
adding fixnums to produce a fixnum.<br>
<br>
<br>
My read of your initial results is that calling an unknown function is<br>
similar to the cost of one iteration in a loop that sets a character in<br>
a string.<br>
<br>
More precisely, decompiling the program shows that the compiler unrolls<br>
the loop in `test1` by 4 iterations, so one call to an unknown function<br>
is the same cost as 4 generic `<`s on fixnums, 4 generic `+ 1`s on<br>
fixnums, 4 `integer->char`s, 4 `string-set!s`, and one jump to a known<br>
function (to recur).<br>
<br>
The `build-string1` loop is similarly unrolled 4 times, and the call to<br>
`build-string1` is not inlined in `test3`, so we really can compare the<br>
unknown function call in `test3` to the overall loop overhead plus<br>
`string-set!`s of `test1`. And the fact that neither `build-string1`<br>
nor `test2 is inlined is consistent with `test2` and `test3` having the<br>
same performance.<br>
<br>
If I change the `for` body of `test1` with a constant, then the time is<br>
cut in half. So, a `string-set!` takes up about half of the time.<br>
<br>
<br>
Putting that all together, it looks like a call to an unknown function<br>
takes about twice the time of a `string-set!` --- which (due to various<br>
tag and bounds checks for the string assignment) costs the same as a<br>
small pile of generic arithmetic on fixnums. That could be considered<br>
expensive in a tight loop.<br>
<br>
I would hesitate to say that higher order functions are always slow,<br>
because many uses do more work around the call than set one character<br>
in a string.<br>
<br>
<br>
At Mon, 04 Aug 2014 07:42:53 +0400, Roman Klochkov wrote:<br>
>  > unknown function call is expensive<br>
> <br>
> So, higher order function always slow. <br>
> Thus, to improve performance, one should use for/fold, for/list, ... and never <br>
> use map, foldl, build-string, ... with lambda.<br>
> Is it correct?<br>
> <br>
> Sun, 3 Aug 2014 13:15:57 -0400 от Matthias Felleisen <<a href="/compose?To=matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>>:<br>
> ><br>
> >Because build-string calls an unknown function 1000 x 100000 times, and an <br>
> unknown function call is expensive. <br>
> ><br>
> >Racket could possible collapse all modules and perform additional in-lining <br>
> optimizations eventually, which may help here. But it doesn't yet. <br>
> ><br>
> >-- Matthias<br>
> ><br>
> ><br>
> ><br>
> >On Aug 3, 2014, at 5:15 AM, Roman Klochkov wrote:<br>
> >>Are higher order function always slow?<br>
> >>...<br>
> >>---<br>
> >><br>
> >>So I see, that build-string version is about two times slower, than <br>
> set-in-the-loop. Why so much? I expected about 10-20% difference.<br>
> >>-- <br>
> >>Roman Klochkov ____________________<br>
> >> Racket Users list:<br>
> >>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
> ><br>
> <br>
> <br>
> -- <br>
> Roman Klochkov<br>
> ____________________<br>
>   Racket Users list:<br>
>   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div>
                        
                
                <base target="_self" href="https://e.mail.ru/">
        </div>

        
</div>


</div>
</blockquote>
<br>
<br>-- <br>Roman Klochkov<br></BODY></HTML>