有关Windows应用程序调优资源(书籍网站等)的任何建议吗?
我有一个C ++控制台应用程序需要以相当高的速率向硬件设备提供大量数据。 (缓冲区大小为32K,每秒消耗约800k字节)
它将在不运行的情况下流式传输数据,除非我执行文件IO,例如打开文件夹等...(它似乎略微满足其时序要求)。
无论如何......一本好的书或资源可以帮助你了解Windows的实时性能。
谢谢!
答案 0 :(得分:4)
您可以在商品Windows上获得的最佳效果是“通常满足时序要求”。如果系统正在运行目标应用以外的任何进程,则 偶尔会因为计划不一致而错过最后期限。但是,如果您的应用程序/硬件可以处理罕见但偶尔的未命中,您可以采取一些措施来减少未命中数。
timeBeginPeriod()
函数(Windows多媒体库的一部分)将调度程序的粒度更改为1ms分辨率如果这不能为您完成工作,您可以考虑尝试应用实时内核补丁的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)
agner.com是一本很棒的优化手册。
正如Rakis所说,你需要在处理循环中非常小心: