- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个基准应用程序,它使用用户定义的线程数来进行处理。我还在为基准测试结果开发一个可视化应用程序。
基准测试本身是用 C++ 编写的(并使用 pthreads 进行线程处理),而可视化工具是用 Python 编写的。
现在,我正在做的就是将 stdout
从基准测试传输到可视化工具。这样做的好处是能够使用像 netcat
这样的工具在一台机器上运行基准测试,在另一台机器上运行可视化工具。
关于基准的一点:
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/
我是一名优秀的程序员,十分优秀!