> On Mar 16, 2016, at 4:08 PM, Greg Parker <gpar...@apple.com> wrote:
> 
> 
>> On Mar 16, 2016, at 9:25 AM, Joe Groff <jgr...@apple.com> wrote:
>> 
>> This sounds awesome. Should we still consider using a non-pointer isa 
>> representation on 64 bit platforms? 16 bytes per object header is still 
>> kinda big. If we laid out the np-isa bits so that the "side allocation" bit 
>> were the MSB, and the strong refcount immediately below it, we could pull 
>> the same trick letting the strong refcount overflow into the side allocation 
>> bit. Drawbacks would be that we'd need to go back to a global sidetable to 
>> reference the overflow allocation, and that on Apple platforms, we'd need to 
>> follow whatever non-pointer-isa layout the Objective-C runtime uses, and the 
>> exact layout of the bits would have to remain runtime-private and thus not 
>> inlineable. If we're running on the assumption that side allocations are 
>> rarely needed, then paying for the lock in the rare case might be worth a 
>> potentially substantial memory savings.
> 
> Packing everything into a single 64-bit field is tricky but might work.
> 
> I think OS X and Linux x86_64 is the worst case currently, with 3 low bits 
> and 17 high bits available. Here's what libobjc stores in its isa field on 
> x86_64:
> 
> 1 bit   is nonpointer
> 1 bit   has associated references
> 1 bit   has destructor
> 44 bits  class pointer
> 6 bits  magic for tools
> 1 bit   is weakly referenced
> 1 bit   is deallocating
> 1 bit   has additional refcount in side allocation
> 8 bits  refcount
> 
> Some of those bits can be combined or reduced:
> 
> is-nonpointer is unnecessary as long as at least one of the bits outside the 
> class pointer is set. There may be binary compatibility problems here, 
> though. (Do existing Swift apps check that bit directly?)
> 
> has-associated-references and is-weakly-referenced and 
> has-additional-refcount could be folded into a single has-sidetable bit. 
> 
> magic is needed for tools like `leaks` to distinguish real objects from 
> non-object allocations. If the isa field is not a simple pointer then there 
> are otherwise too many false objects for `leaks` to be usable. 6 bits is 
> pushing the bare minimum here, but we might be able to trim this by making 
> the tools smarter and more invasive. (For example: if the has-sidetable bit 
> is set then look for a side allocation pointing back to the object. If you 
> don't find one then it's not a real object.)  Being able to run `leaks` and 
> `heap` on an unprepared process is an important capability, and I don't think 
> we can afford to cripple it.
> 
> refcount can always be trimmed. I don't know what the shape of the "objects 
> whose refcount is ever greater than X" curve looks like.
> 
> 
> Given the above, we can claw back enough bits for things like a small unowned 
> refcount and is-pinned or is-nonstructurally-mutating bits. 
> 
> My biggest concern is future Swift concurrency support. I suspect we will 
> want storage for a thread ID or a lock. Maybe those would be uncommon enough 
> that they can live in a side allocation. Will we want a thread ID in every 
> thread-local object in production code so we can assert that it has not 
> incorrectly escaped, or can we leave things like that for debug builds only?
> 
> 
> One scheme that I want to investigate for ObjC's use is to allocate a flat 
> array of side allocations, and store an index into that array in the isa 
> field's extra bits. Depending on architecture that allows between 256K and 
> 64M objects with side allocations before falling back to a global table. If 
> that works well enough then packing everything into a single pointer-size 
> field becomes more plausible.
> 
> 
> Joe, did you measure the cost of a mask operation at every Swift virtual 
> call? I can't remember.

Yeah. The effect of the mask operation was unmeasurable on the Macbook Pro and 
iPhone 5s I was testing on. Masking using a resilient mask value loaded from a 
dylib did have a noticeable impact on an Apple Watch, though.

-Joe
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to