Lots of info here: http://docs.julialang.org/en/release-0.3/manual/faq/#how-do-abstract-or-ambiguous-fields-in-types-interact-with-the-compiler
--Tim On Friday, March 27, 2015 06:19:53 PM [email protected] wrote: > One of the patterns I use a lot at work is when there are a number of > options for a certain model, and we want to be able to just select one to > use. We also want to be able to change which model is being used part way > through the overall execution of the code. In C++, we have an abstract > base class, and then each model fills in the virtual methods for its > particular algorithm. Some manager class keeps a pointer to the base > class, and we can change that pointer to change the model. > > I tried doing this same thing in Julia. I have a few versions of the code, > they are all in a gist: > https://gist.github.com/danielmatz/1a64cded91f996d40b99. > > The version slow.jl is the approach I would use in C++. Since I knew that > using abstract types directly was a performance hit, I mdd a second > version, fast.jl, that instead uses an integer flag to indicate which model > to use. This second version is 10x faster and uses less memory. > > I'm curious about why this performance difference is so pronounced. What > exactly is going on that makes virtualization "expensive"? The Julia > dispatch code must be doing something more than how I conceptualize it > (i.e., as a set of if statements). I'm just curious what that is. > > To try to investigate this, I made yet another version, other.jl (yeah, > stupid names, sorry), that is like slow.jl, but instead imitates dispatch > with isa. Even this is faster, by about 2x! > > I'd love to learn more about what is going on in these three cases. I'm > also curious if this is something that is expected to get faster in the > future? > > Thanks for the help. And thanks for being patient with simple minded > engineers like myself… Hopefully I didn't screw up the terminology too > badly. > > Daniel
