> On Mar 15, 2016, at 11:59 PM, Greg Parker via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> I am considering a new representation for Swift refcounts and other 
> per-object data. This is an outline of the scheme. Comments and suggestions 
> welcome.
> 
> Today, each object stores 64-bits of refcounts and flags after the isa field.
> 
> In this new system, each object would store a pointer-size field after the 
> isa field. This field would have two cases: it could store refcounts and 
> flags, or it could store a pointer to a side allocation that would store 
> refcounts and flags and additional per-object data.
> 
> Advantages:
> * Saves 4 bytes per object on 32-bit for most objects.
> * Improves refcount overflow and underflow detection.
> * Might allow an inlineable retain/release fast path in the future.
> * Allows a new weak reference implementation that doesn't need to keep entire 
> dead objects alive.
> * Allows inexpensive per-object storage for future features like associated 
> references or class extensions with instance variables.
> 
> Disadvantages:
> * Basic RR operations might be slower on x86_64. This needs to be measured. 
> ARM architectures are probably unchanged.

I wrote a performance mockup of the fast path. It simply checks the MSB in the 
appropriate places in RefCount.h but does not actually implement any side 
allocation. I ran it on some RR-heavy benchmarks (QuickSort, InsertionSort, 
HeapSort, Array2D) on x86_64 and arm64.

arm64 is in fact approximately unchanged. Any difference either way is much 
less than 1%.

x86_64 is measurably slower:
   1% QuickSort
   2% InsertionSort
   4% Array2D
   5% HeapSort


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler


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

Reply via email to