Don't use a macro, just use the @anon macro to create an object that will be 
fast to use as a "function."

--Tim

On Wednesday, March 25, 2015 01:00:27 PM Phil Tomson wrote:
> I have a couple of instances where a function is determined by some
> parameters (in a JSON file in this case) and I have to call it in this
> manner.  I'm thinking it should be possible to speed these up via a macro,
> but I'm a macro newbie.  I'll probably post a different question related to
> that, but would a macro be feasible in an instance like this?
> 
> On Wednesday, March 25, 2015 at 12:35:20 PM UTC-7, Tim Holy wrote:
> > There have been many prior posts about this topic. Maybe we should add a
> > FAQ
> > page we can direct people to. In the mean time, your best bet is to search
> > (or
> > use FastAnonymous or NumericFuns).
> > 
> > --Tim
> > 
> > On Wednesday, March 25, 2015 11:41:10 AM Phil Tomson wrote:
> > >  Maybe this is just obvious, but it's not making much sense to me.
> > > 
> > > If I have a reference to a function (pardon if that's not the correct
> > > Julia-ish terminology - basically just a variable that holds a Function
> > > type) and call it, it runs much more slowly (persumably because it's
> > > allocating a lot more memory) than it would if I make the same call with
> > > the function directly.
> > > 
> > > Maybe that's not so clear, so let me show an example using the abs
> > 
> > function:
> > >     function test_time()
> > >     
> > >          sum = 1.0
> > >          for i in 1:1000000
> > >          
> > >            sum += abs(sum)
> > >          
> > >          end
> > >          sum
> > >      
> > >      end
> > > 
> > > Run it a few times with @time:
> > >    julia> @time test_time()
> > >    
> > >     elapsed time: 0.007576883 seconds (96 bytes allocated)
> > >     Inf
> > >    
> > >    julia> @time test_time()
> > >    
> > >     elapsed time: 0.002058207 seconds (96 bytes allocated)
> > >     Inf
> > >     
> > >     julia> @time test_time()
> > >     elapsed time: 0.005015882 seconds (96 bytes allocated)
> > >     Inf
> > > 
> > > Now let's try a modified version that takes a Function on the input:
> > >     function test_time(func::Function)
> > >     
> > >          sum = 1.0
> > >          for i in 1:1000000
> > >          
> > >            sum += func(sum)
> > >          
> > >          end
> > >          sum
> > >      
> > >      end
> > > 
> > > So essentially the same function, but this time the function is passed
> > 
> > in.
> > 
> > > Running this version a few times:
> > >     julia> @time test_time(abs)
> > >     elapsed time: 0.066612994 seconds (32000080 bytes allocated, 31.05%
> > > 
> > > gc     time)
> > > 
> > >     Inf
> > >     
> > >     julia> @time test_time(abs)
> > >     elapsed time: 0.064705561 seconds (32000080 bytes allocated, 31.16%
> > 
> > gc
> > 
> > > time)
> > > 
> > >     Inf
> > > 
> > > So roughly 10X slower, probably because of the much larger amount of
> > 
> > memory
> > 
> > > allocated (32000080 bytes vs. 96 bytes)
> > > 
> > > Why does the second version allocate so much more memory? (I'm running
> > > Julia 0.3.6 for this testcase)
> > > 
> > > Phil

Reply via email to