如果您正在寻找现实世界的比较,这里有一个例子。我们的应用程序有两个线程:1)用于网络数据包捕获的读取器线程;2)将数据包接收、计数并报告统计信息的消费者线程。
线程 #1 一次只与线程 #2 交换一个数据包。
结果 #1 - 使用自定义的基于 CAS 的交换方法,使用与 SynchronousQueue 相同的原理,我们的类名为 CASSynchronousQueue:
30,766,538 packets in 59.999 seconds :: 500.763Kpps, 1.115Gbps 0 drops
libpcap statistics: recv=61,251,128, drop=0(0.0%), ifdrop=0
结果 #2 - 当我们使用标准的Java SynchronousQueue 替换我们的CAS实现时:
8,782,647 packets in 59.999 seconds :: 142.950Kpps, 324.957Mbps 0 drops
libpcap statistics: recv=69,955,666, drop=52,369,516(74.9%), ifdrop=0
我认为性能差异再清晰不过了。