Hi Eric,

nice - this is exactly what I meant. I wonder if Julia Symbols themselves could become like this in the future.


Cheers,

Oliver


On 17.08.2016 18:44, Erik Schnetter wrote:
See <https://github.com/eschnett/ValueSymbols.jl> for what I had in mind.

-erik

On Wed, Aug 17, 2016 at 10:32 AM, Yichao Yu <[email protected]
<mailto:[email protected]>> wrote:



    On Wed, Aug 17, 2016 at 10:19 PM, Oliver Schulz
    <[email protected] <mailto:[email protected]>>
    wrote:

        Hi Yichao

        I get that - I was just curious why (and I guess there's likely
        a very good reason for it). My intuition would be that a
        non-GCed interned string type could be represented by a bitstype
        (i.e. a pointer or index to the string table). So I was
        surprised that Symbol is an object reference and wanted to
        understand this a bit better.


    It's a pointer to managed memory with tag that's all what's needed
    for it to be a !pointerfree type. There are way more things that we
    don't GC and it has nothing to do with whether it's a isbits type or
    not.




        Cheers,

        Oliver


        On Wednesday, August 17, 2016 at 3:35:41 PM UTC+2, Yichao Yu wrote:


            > PS: Yes, symbols in Julia should be bitstypes.

            No, it's a object reference and isn't a `isbits()` type.



                On Wed, Aug 17, 2016 at 8:26 AM, Cedric St-Jean
                <[email protected]> wrote:

                    Good points.

                    Given that symbols have a name which is a string, I
                    don't see how they could be a bits-type unless they
                    just became numbers to index into a global array
                    somewhere...... i.e. a pointer. Stack-allocating
                    non-bits-type immutables is on the roadmap to 1.0,
                    so that should solve your problems.

                    Maybe you can solve the CategorizedPoint problem by
                    using an @enum.

                    On Wed, Aug 17, 2016 at 6:48 AM, Oliver Schulz
                    <[email protected]> wrote:

                        Hello Andreas,

                        consider iterating over a Dict{Symbol,Int64}:

                        |
                        d =Dict(:foo =>42,:bar =>77)
                        forx ind println("$(typeof(x)), $(isbits(x))")end
                        |


                        During iteration, a lot of stack allocated
                        "Pair{Symbol,Int64}" objects are created. That
                        is very bad for performance.

                        |
                        immutable CategorizedPoint
                            x::Float64
                            y::Float64
                            category::Symbol
                        end
                        |


                        Also, consider a (hypothetical) data type for
                        categorized points (with a finite number of
                        categories - but extensible, so that Symbol is a
                        better fit than using an enum):

                        immutable CategorizedPoint
                            x::Float64
                            y::Float64
                            category::Symbol
                        end

                        I would definitely want this to be a bits-type,
                        and not have every instance heap-allocated.


                        Cheers,

                        Oliver


                        On Wednesday, August 17, 2016 at 11:44:13 AM
                        UTC+2, Andreas Lobinger wrote:

                            Hello colleague,

                            On Wednesday, August 17, 2016 at 11:12:51 AM
                            UTC+2, Oliver Schulz wrote:

                                Sure -  I was assuming that as Symbol
                                (as an interned string) is basically
                                just a pointer. So comparisons are O(1),
                                etc. What I'd like to understand is, why
                                can't it be a bitstype? Currently, it's
                                not, so Symbol cannot be used in a
                                lightweight (i.e. stack-allocated)
                                immutable type. I assume there's a good
                                reason for it, I just want to understand
                                why.


                            Could you make an example how you would like
                            to use Symbol in lightweight types?





                --
                Erik Schnetter <[email protected]>
                http://www.perimeterinstitute.ca/personal/eschnetter/
                <http://www.perimeterinstitute.ca/personal/eschnetter/>






--
Erik Schnetter <[email protected] <mailto:[email protected]>>
http://www.perimeterinstitute.ca/personal/eschnetter/

Reply via email to