【问题标题】:Resource recommendations for Windows performance tuning (realtime)Windows 性能调整的资源建议(实时)
【发布时间】:2010-09-20 19:30:24
【问题描述】:

对于 Windows 应用程序调优资源(书籍网站等)有什么建议吗?

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

它将流式传输数据而不会运行不足,除非我执行文件 IO,例如打开文件夹等...(它似乎勉强满足其时间要求)。

无论如何.. 一本好书或资源来复习 windows 的实时性能会很有帮助。

谢谢!

【问题讨论】:

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


【解决方案1】:

在商品 Windows 上,您可以期望的最好结果是“通常满足时序要求”。如果系统正在运行您的目标应用程序以外的任何进程,它偶尔会由于调度不一致而错过最后期限。但是,如果您的应用/硬件可以处理罕见但偶尔的缺失,您可以采取一些措施来减少缺失的数量。

  1. 将进程的优先级设置为 REALTIME_PRIORITY_CLASS
  2. 通过timeBeginPeriod() 函数(Windows 多媒体库的一部分)将调度程序的粒度更改为 1 毫秒分辨率
  3. 在主循环中尽可能避免系统调用(这包括分配内存)。每次系统调用都是操作系统使进程进入睡眠状态的机会,因此也是非确定性调度程序错过下一个截止日期的机会

如果这不能为您完成工作,您可以考虑尝试应用了实时内核补丁的 Linux 发行版。我发现那些可以提供近乎完美的计时(在几个小时的过程中,精度在 10 微秒以内)。也就是说,真正的实时操作系统实际上会给您带来完美,但实时 Linux 发行版比商品 Windows 更接近

【讨论】:

  • 感谢@Rakis 提供的信息。 WRT:Windows,不幸的是,我们只能使用用于自定义硬件的 Windows 驱动程序。
【解决方案2】:

我要做的第一件事就是将其调整到尽可能精简的位置。 I use this method. For these reasons. 因为它是一个控制台应用程序,另一个选择是尝试LTProf,它会告诉你是否有任何可以有效优化的东西。完成后,您将处于寻找缓冲区计时问题的最佳位置,正如@Hans 建议的那样。

【讨论】:

    【解决方案3】:

    来自agner.comOptimizing software in C++ 是一本很棒的优化手册。

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

    • 没有内存分配。请改用堆栈和预分配内存。
    • 没有投掷。异常非常昂贵,在 win32 中它们甚至不抛出都有成本。
    • 没有多态性。您将节省一些间接。
    • 广泛使用内联。
    • 没有锁。尽可能尝试无锁方法。

    【讨论】:

    • 谢谢,在这种情况下,我的处理基本上是从 tcp(实际上是 ZMQ)接收块,聚合它们并将它们提供给硬件 API。
    【解决方案4】:

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

    如果不能选择更大的缓冲区,那么您正在寻找设备驱动程序以获得这种服务保证。或者介于两者之间的东西可以提供更大的缓冲区。

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多