Windows性能调优的资源建议(实时)

时间:2010-09-20 19:30:24

标签: c++ c windows performance real-time

有关Windows应用程序调优资源(书籍网站等)的任何建议吗?

我有一个C ++控制台应用程序需要以相当高的速率向硬件设备提供大量数据。 (缓冲区大小为32K,每秒消耗约800k字节)

它将在不运行的情况下流式传输数据,除非我执行文件IO,例如打开文件夹等...(它似乎略微满足其时序要求)。

无论如何......一本好的书或资源可以帮助你了解Windows的实时性能。

谢谢!

4 个答案:

答案 0 :(得分:4)

您可以在商品Windows上获得的最佳效果是“通常满足时序要求”。如果系统正在运行目标应用以外的任何进程,则 偶尔会因为计划不一致而错过最后期限。但是,如果您的应用程序/硬件可以处理罕见但偶尔的未命中,您可以采取一些措施来减少未命中数。

  1. 将您的流程优先级设置为REALTIME_PRIORITY_CLASS
  2. 通过timeBeginPeriod()函数(Windows多媒体库的一部分)将调度程序的粒度更改为1ms分辨率
  3. 尽可能避免主循环中的系统调用(包括分配内存)。每个系统调用都是操作系统将进程置于睡眠状态的机会,因此,非确定性调度程序有机会错过下一个截止日期
  4. 如果这不能为您完成工作,您可以考虑尝试应用实时内核补丁的Linux发行版。我发现那些提供近乎完美的时间(在几个小时的过程中,精确度在10微秒内)。也就是说,真正的实时操作系统实际上会给你完美,但实时Linux发行版比商品Windows更接近

答案 1 :(得分:1)

缓冲区将持续40毫秒。对于具有如此严格的时序要求的Windows,您无法保证零欠载。在用户模式领域,当内核线程执行他们需要做的事情时,您可能会看到数百毫秒。他们以更高的优先级运行,你可以获得。工作站版本上的线程量程是时钟周期的3倍,已超过40毫秒(3 x 15.625毫秒)。你甚至无法可靠地与用户模式线程竞争,这些线程提升了他们的优先级并度过了他们的美好时光。

如果更大的缓冲区不是一个选项,那么您正在查看设备驱动程序以获得此类服务保证。或者介于两者之间的东西可以提供更大的缓冲。

答案 2 :(得分:1)

我要做的第一件事就是把它调到尽可能精益的地方。 I use this method.对于these reasons.因为它是一个控制台应用,另一种选择是尝试LTProf,它会告诉您是否有任何可以有效优化的内容。完成后,就像@Hans建议的那样,你将处于寻找缓冲时间问题的最佳位置。

答案 3 :(得分:1)

来自Optimizing software in C++

agner.com是一本很棒的优化手册。

正如Rakis所说,你需要在处理循环中非常小心:

  • 没有内存分配。请改用堆栈和预分配内存。
  • 没有投掷。例外是非常昂贵的,在win32中他们甚至不会投掷成本。
  • 没有多态性。你会节省一些间接。
  • 广泛使用内联。
  • 没有锁。尽可能尝试无锁方法。
相关问题