Thanks for responding Tim. I'll do some searches on those key-words you 
mentioned.

For anyone else reading, in the meantime I ran across this StackOverflow 
question 
<http://stackoverflow.com/questions/26173635/performance-penalty-using-anonymous-function-in-julia>
 
which also contains some ideas for working around this issue.

Cheers,

Colin

On Thursday, 19 February 2015 23:39:36 UTC+11, Tim Holy wrote:
>
> On 0.4 there are some pretty good solutions to this problem, but nothing 
> has 
> yet been "wrapped up" into something very convenient. (There are a few 
> nontrivial issues left to figure out, since it involves automatic 
> generation of 
> types.) 
>
> I don't have time to find it for you right now, but you can search for old 
> posts here (or perhaps julia-dev) on stagedfunctions and call overloading. 
> (Mauro was involved in that thread.) Also see 
> https://github.com/JuliaOpt/Optim.jl/issues/102#issuecomment-74658825 
>
> --Tim 
>
>
> On Wednesday, February 18, 2015 09:25:11 PM [email protected] 
> <javascript:> wrote: 
> > Hi all, 
> > 
> > Using Julia v0.3.x, there appears to be a significant performance hit 
> when 
> > using functions as variables or using anonymous functions. I asked a 
> > StackOverflow question about it here 
> > <
> http://stackoverflow.com/questions/28356437/julia-compiler-does-not-appear-> 
> to-optimize-when-a-function-is-passed-a-function>, and, as I understand it, 
> > the problem is that the compiler is currently unable to determine the 
> type 
> > of the output of a function when that function is itself a variable or 
> an 
> > anonymous function - consequently, a big performance hit. I run into 
> this 
> > issue on an (almost) daily basis, so I was wondering what the best 
> > work-around is at this point. Thus far, there are three solutions I'm 
> aware 
> > of: 
> > 
> > 1) Suffer the slower performance: If the function-as-variable/anonymous 
> > function is itself a fairly big function, then the slow-down associated 
> > with the unknown output type is not such a big deal when overall 
> run-time 
> > is taken into consideration. However, frequently the function in 
> question 
> > is simple, and so this option is not really tenable in these cases. 
> > 
> > 2) Use Tim Holy's very cool FastAnonymous 
> > <https://github.com/timholy/FastAnonymous.jl> package: For the case of 
> > anonymous functions, this package speeds things up quite a bit. However, 
> my 
> > understanding is that it is still a bit of a work-around. Moreover, 
> there 
> > are some cases in my code where there was still a fairly significant 
> > performance hit relative to the in-lined case (if anyone wants more 
> detail 
> > on this I'm happy to provide it) 
> > 
> > 3) Write in-line code: This results in the best possible speed, but 
> there 
> > ends up being quite a lot of code duplication in my function. For 
> example, 
> > my code might look something like this: 
> > if method == "Method1" 
> >     for n = 1:N 
> >         y[n] = Method1Function(x1[n], x2[n]) 
> >     end 
> > elseif method == "Method2" 
> >     for n = 1:N 
> >         y[n] = Method2Function(x1[n], x2[n]) 
> >     end 
> > elseif etc.... 
> >   . 
> >   . 
> >   . 
> > end 
> > Most of the time the loops are more complicated than just simply 
> iterating 
> > from 1:N, so the code gets really long and is mostly duplication. 
> Moreover, 
> > if you want to allow for an arbitrarily large class of functions to be 
> > applied within the loop, this solution is not tenable. 
> > 
> > I understand the core development team is currently aiming to deal with 
> > this by v1.0, although there was some noise here 
> > <https://github.com/JuliaLang/julia/issues/1864>  about trying to get 
> > things working by the v0.4 stable release. In the meantime, I'm 
> interested 
> > in the best work-around that other members of this user-group have come 
> up 
> > with. 
> > 
> > Cheers, 
> > 
> > Colin 
>
>

Reply via email to