性能测试:ArrayBlockingQueue vs. Go channel
测试方案:
- 主线程将一个 Integer 对象发到 Channel 0
- 线程 i 将对象从 Channel i 不断搬运到 Channel i+1
- 最后一个线程从 Channel N-1 中拿到对象,做加和
为了保证公平,Go 中自行封装一个 Integer 而不是用 int 型;考虑到实际中大多数情况下 channel 里走的都是对象而非基本类型,这样是合理的。
发现二者完成时间基本都在 3.8s ~ 4.0s 之间,可以说没有差异。 ArrayBlockingQueue 的性能看来还是很高的。
PS. 尝试了容量不限的 ListBlockingQueue,时间在 5s 左右,也还可以接受。
测试代码在这里。