> On Feb 16, 2017, at 6:48 PM, Jiho Choi via swift-dev <swift-dev@swift.org> > wrote: > > Hi, > > I was curious about the overhead of ARC and started profiling some benchmarks > found in the Computer Language Benchmark Game > (http://benchmarksgame.alioth.debian.org/u64q/measurements.php?lang=swift > <http://benchmarksgame.alioth.debian.org/u64q/measurements.php?lang=swift>). > So far, it seems that ARC sequence optimization is surprisingly good and most > benchmarks don't have to perform ARC operations as often as I expected. I > have some questions regarding this finding. > > I compiled all benchmarks with "-O -wmo" flags and counted the number of > calls to ARC runtime (e.g., swift_rt_swift_retain) using Pin. > > 1. Reference counting is considered to have high overhead due to frequent > counting operations which also have to be atomic. At least for the > benchmarks I tested, it is not the case and there is almost no overhead. Is > it expected behavior? Or is it because the benchmarks are too simple (they > are all single-file programs)? How do you estimate the overhead of ARC would > be?
It is possible that the optimizer eliminated many reference counting operations here. Also my understanding is that while atomic operations are more expensive than non-atomic operations, the real cost only comes into play if you actually have contention due to bouncing cache lines. In a single-threaded workload the overhead is not that great. > > 2. I also tried to compile the same benchmarks with "-Xfrontend > -assume-single-threaded" to measure the overhead of atomic operations. > Looking at the source code of this experimental pass and SIL optimizer's > statistic, the pass seems to work as expected to convert all ARC operations > in user code into nonatomic. However, even when using this flag, there are > some atomic ARC runtime called from the user code (not library). More > strangely, SIL output said all ARC operations in the user code have turned > into nonatomic. The documentation says ARC operations are never implicit in > SIL. So if there is no atomic ARC at SIL-level, I expect the user code would > never call atomic ARC runtime. Am I missing something? IRGen still emits atomic reference counting operations when it produces value witness operations. I think there’s a PR open right now to address this: https://github.com/apple/swift/pull/7421 <https://github.com/apple/swift/pull/7421> > > 3. Are there more realistic benchmarks available? Swift's official > benchmarks also seem pretty small. Contributions are welcome :-) > > Thanks, > Jiho > _______________________________________________ > swift-dev mailing list > swift-dev@swift.org > https://lists.swift.org/mailman/listinfo/swift-dev
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev