我们设置了一个基于任务的多线程引擎,其中调度程序将任务传递给线程无锁队列。该引擎使用 C++ 和 DirectX 进行渲染,我们使用 boost::thread 创建线程。在窗口模式下,它会随机减速一秒钟左右,然后再加速。这似乎是 Vista 造成的,但我们无法弄清楚如何正确解决它。
我们尝试过的一件似乎有助于随机减速的方法是在处理完每个任务后让线程休眠一毫秒,但这会导致其他问题,并不是一个很好的解决方案。
我们设置了一个基于任务的多线程引擎,其中调度程序将任务传递给线程无锁队列。该引擎使用 C++ 和 DirectX 进行渲染,我们使用 boost::thread 创建线程。在窗口模式下,它会随机减速一秒钟左右,然后再加速。这似乎是 Vista 造成的,但我们无法弄清楚如何正确解决它。
我们尝试过的一件似乎有助于随机减速的方法是在处理完每个任务后让线程休眠一毫秒,但这会导致其他问题,并不是一个很好的解决方案。
我建议做的第一件事是通过分析了解导致减速的原因。
随机睡眠很少是一个好主意(从这里的经验来看,是的,我已经这样做了,是的,我稍后已经解决了这个问题),也不是推测性能问题的根源,特别是在多线程环境中。
Visual Studio 2010 beta1 有一个很棒的分析器,如果它在你的应用程序中,它非常适合了解导致速度变慢的原因,Hazim Shafi 的博客介绍了如何使用它。
您还可以查看Windows 性能工具包中提供的 xperf 工具(您必须使用平台 sdk 安装程序,但您只需要安装该节点,因此它实际上非常快)。
have you tried running the same code under XP and Windows 7?
I have some multithreaded code that renders to offscreen compatible bitmaps. Each thread renders to its own compatible bitmap. However for some odd reason this drawing takes AGES on vista. I lose over 50% of my processing time to the GDI rendering. Under Win 7 and XP I have no such problems. Interestingly I came across this article which implies that multithreaded GDI rendering under Vista is hopelessly broken. At some point I will try and come up with a method in which all rendering is done by my main thread instead of from ancillary threads to test out if Vista performance improves. This would be a huge nightmare of a thing to code though and my primary market uses XP so i'm not al; that fussed at the moment ...