gpt4 book ai didi

c++ - 多线程和标准输出的性能问题

转载 作者:太空狗 更新时间:2023-10-29 21:26:14 30 4
gpt4 key购买 nike

我正在开发一个基准应用程序,它使用用户定义的线程数来进行处理。我还在为基准测试结果开发一个可视化应用程序。

基准测试本身是用 C++ 编写的(并使用 pthreads 进行线程处理),而可视化工具是用 Python 编写的。

现在,我正在做的就是将 stdout 从基准测试传输到可视化工具。这样做的好处是能够使用像 netcat 这样的工具在一台机器上运行基准测试,在另一台机器上运行可视化工具。

High level diagram of the application

关于基准的一点:

  • 它非常受 CPU 限制
  • 每个线程每隔 10 毫秒写入一次重要数据(即可视化工具所需的数据)。
  • 打印的每个数据都是一行 5 到 20 个字符。
  • 如前所述,线程数变化很大(可以是 1、2、40 等)
  • 尽管数据不被破坏很重要(例如,一个线程在 printf/cout 期间抢占另一个线程,导致打印数据与另一个线程上的输出),以正确的顺序完成写入并不是很重要。

关于最后一点的例子:

// Thread 1 prints "I'm one\n" at the 3 seconds mark
// thread 2 prints "I'm two\n" at the 4 seconds mark

// This is fine
I'm two
I'm one

// This is not
I'm I'm one
two

在基准测试中,我从 std::cout 切换到 printf 因为它更接近 write (2) 顺序以尽量减少不同线程的输出之间交错的机会。

我担心随着线程数量的增加,从多个线程写入 stdout 会导致瓶颈。非常重要的一点是,基准测试的可视化输出部分极少占用资源,以免影响结果。

我正在寻找一种有效的方法来让我的两个应用程序对话,而不会对我的基准性能产生超过绝对必要的影响。有任何想法吗?你们中有人解决过这样的问题吗?任何更智能/更清洁的解决方案?

最佳答案

写入标准输出不太可能成为任何现实世界问题的性能瓶颈。如果是,则说明您要么记录了太多日志,要么对一个任务进行了基准测试,该任务速度太快以至于无法根据背景噪音进行测量。然而,这是一个线程安全错误。您对 printf 与 cout 的选择只是巫术——两者都不是线程安全的。如果您想在多线程环境中使用缓冲 I/O,您需要自己序列化调用(使用 pthread_mutex_t,或使用信号量实现队列等)。如果你想依靠系统调用原子性来为你做这件事(在内部,内核做完全相同类型的序列化),你需要自己进行系统调用而不是依赖 printf 是“接近”写。

关于c++ - 多线程和标准输出的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12182847/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com