On Sat, Feb 20, 2016 at 6:10 AM, Kristoffer Carlsson
<[email protected]> wrote:
> I considered something like your idea Erik, but what I find unfortunate is
> that to write new functions for the type you need to define them for both
> types, that is, both Impl1 and Impl2. Some typealias of a Union{Impl1,
> Impl2} might make that smoother though.
I used an abstract type in my code, but a union will also work.
> I also didn't get your inline trick to work, in the code below, a is not
> inferred but b is.
`a` is a type, `b` is a value. You forgot another set of parentheses
to call the constructor.
-erik
> type Impl1 end
> type Impl2 end
>
> @inline Impl(N) = getImpl(Val{N})
>
> getImpl(::Type{Val{1}}) = Impl1
> getImpl(::Type{Val{2}}) = Impl2
>
> function foo{N}(::Type{Val{N}})
> a = Impl(N)
> b = getImpl(Val{N})()
> return a, b
> end
>
>
> Ben, that seems like an okay solution except I don't really like that the
> internal representation leaks out to the user. I might want to completely
> change the storage format at some later point (like making things stack
> allocated) which would change the interface for a user.
>
> On Saturday, February 20, 2016 at 12:34:00 AM UTC+1, Erik Schnetter wrote:
>>
>> To check performance, I usually look at the generated machine code
>> (`code_native`). If there's a type instability, the code is a mess. I
>> understand that that's not everybody's preferred method since it
>> requires reading and understanding machine code...
>>
>> A better method would be to use `@time` and `@profile` in the usual
>> manner. Inefficiencies and type instabilities should show up there.
>>
>> -erik
>>
>> On Fri, Feb 19, 2016 at 6:23 PM, Davide Lasagna <[email protected]>
>> wrote:
>> > Cool trick, thanks. I had a similar problem and ended up defining
>> > methods with the Val{} argument for dispatch on different values. I was not
>> > entirely happy with it, though, because of all the extra typing of
>> > parenthesis. Will try adding an inlined calling method.
>> >
>> > How in practice would you go checking that you do not really hit
>> > performance?
>> >
>> > Davide
>>
>>
>>
>> --
>> Erik Schnetter <[email protected]>
>> http://www.perimeterinstitute.ca/personal/eschnetter/
--
Erik Schnetter <[email protected]>
http://www.perimeterinstitute.ca/personal/eschnetter/