文章插图
图片
哦!带通道的新版本花费了两倍时间,这是怎么了?
2.环形缓冲器你可以用火焰图进行测试,但还是省省时间吧!
无论多小,所有通道库的构建都会产生额外的费用,并行化所带来的好处必须大于此种开销,才能保证系统正常运作 。这种情况下的瓶颈是通道send()和recv() 。由于Rust中的标准库mpsc通道相对缓慢,但仍有其它替代方案,比如,crossbeam-channel 。
为此,我们分析了4个不同的通道库,结果如下:
文章插图
图片
显然,ringbuf和rtrb速度最快 。因为它们的环形缓冲区无锁,扮演着“单个生产者-单个消费者”的角色 。单个生产者意味着只有一个管道将数据放入队列,另一个管道将负责数据输出,这比“多生产者队列”开销小 。
此外,这些程序库也是非阻塞式的 。当队列已满时,如果尝试推送,它将提示“error”而不是“block”,“空队列”亦是如此 。
为使用这些环形缓冲区库,我添加了自旋锁,以便在通道阻塞时继续重试 。事实证明,这也是高频交易架构中所使用的方法 。
我还发现,在等待时增加非常短的“休眠”时间整体性能就能提高 。这可能是由于当核心使用率达到100%或高于某些温度时,启动CPU就会发生节流的现象 。
如下是新的pop()和push(value)帮助器:
文章插图
图片
我们将用新方法展示:
文章插图
图片
【Rust中的高吞吐量流处理】速度确实比以前快了,但也快不了多少,现在,就让我们把并行化提升至另一个层次 。
3.更多的并行化目前,我们为哈希创建了两个线程,一个用于SHA512,另一个用于BLAKE3 。两者中较慢的那个将成为我们技术发展的瓶颈 。为证明这一点,我重新运行了原始的单线程示例,仅使用SHA512哈希,结果如下:
文章插图
图片
这与并行哈希示例中的性能非常接近,意味着,总体上花在哈希上的大部分时间都是由SHA512产生 。
那么,如果我们同时创建更多的线程并将多个数字进行散列排列呢?让我们试一试 。我们将创建2个SHA512哈希线程和2个BLAKE3哈希线程来启动 。
4.可视化每个线程都拥有自己的输入和输出队列 。我们将用循环顺序将生成的数字循环发送至每个线程并用相同的顺序读取结果 。
文章插图
图片
这确保了流的顺序能够在结果线程中维持不变;如果排序不重要或消息处理时间多变,那么,其它的调度机制可能会更好 。
如下是循环调度代码:
文章插图
图片
新的代码更复杂,部分如下:
文章插图
图片
一起来看看,现在表现如何?输出结果如下:
文章插图
图片
确实好多了!
5.测量“闲置”和“阻塞”时间每个哈希函数应该有多少个线程?在更复杂的系统中,这很难确定,甚至可能是动态的 。
实际上,有一种技术对“流处理”很有帮助,即,在某个时间窗口内测量空闲和阻塞时间 。
- 空闲时间
- 全程时间
空闲时间是pop()期间旋转的时间,阻塞时间是push()期间旋转的时间 。我修改了这两个函数,用来跟踪花费时间 。这段代码使用了开销很小的单元:
文章插图
图片
我还创建了一个新的线程统计这些时间,输出结果如下:
文章插图
图片
我们可以看到,sha512线程既没有“空闲”也没有“阻塞”,而是100%处于活跃状态;此外,我们还能通过增加sha512线程数量为系统提速 。
推荐阅读
- 分布式系统中的CAP理论
- 何洁瘦身后高调发布照片,一家五口拍大片晒幸福,三个孩子都像她
- 汪峰演唱会,观众齐声高呼刀郎的名字,那英今后还敢开演唱会吗
- 五六十岁的女人,夏天戴帽子要记住“3戴3不戴”,会更优雅又高级
- 演员司马燕胃癌病逝8年,丈夫和闺蜜再婚,在其忌日还高调秀恩爱
- 高贵文雅的男孩名字大全 高贵文雅的男孩名字
- 张柏芝大儿子返港,身高已经赶上谢霆锋,机场还帮助爸爸推行李 ?
- 高露:隐婚为丈夫生下一儿一女,是我这辈子最正确的决定
- 大反转?汪峰23分视频回应刀郎新歌,尽显高情商与大格局
- 目中无人!女明星欺负助理:睡浴缸,丢在高速路边,任意取笑!不红是报应!