【问题标题】:Does Windows limit CPU time?Windows 是否限制 CPU 时间?
【发布时间】:2013-06-03 01:27:37
【问题描述】:

我用 C# 编写了一个应用程序,前几分钟它每秒执行超过 11.000 次操作 (SHA1/AES)。但是当我让它运行几分钟时,它会下降到 6.000 p/sec,并在这个水平上保持几个小时。如果我重新启动应用程序,它将返回到 11.000。任务管理器中的 CPU 使用率显示出类似的模式。

现在我正在寻找一个解释,或者我测量每秒操作数的方式存在巨大错误(但在这种情况下,任务管理器会讲述不同的故事),或者 Windows 一次给我的程序更少的 CPU 时间它注意到它正在执行繁重的工作。两者似乎都不太可能,那么重启后运行速度更快的原因是什么?

【问题讨论】:

  • 您的应用程序可能不会被视为更高的优先级,因此当更重要的任务出现时,它可能会击倒您的应用程序。 Windows 不应该关心工作,它只关心确保它自己的功能。

标签: c# windows performance cpu-usage slice


【解决方案1】:

听起来你的时间最终会受到垃圾收集的影响。您是否正在创建大量不是超级短命的对象?如果你的 Visual Studio 版本支持它,你应该对这个场景进行性能分析,并查看你的时间被方法花费在了哪里。

如果.NET 4.0+,您也可以尝试在<runtime> 节点下的Web 或App 配置中使用<gcServer enabled="true" /> 来启用多线程垃圾收集...意味着它会暂时暂停您的应用程序以立即清理并然后,但它可能比在后台收集持续消耗的线程更好。

【讨论】:

  • 对于每个操作都会创建一个 RijndaelManaged 对象,它应该是非常短暂的,因为每秒有数千个操作。 SHA1 对象对于所有工作人员都是静态的(我使用 Parallel ForEach),因此不应该影响 GC。我将查看代码,看看是否可以在任何地方添加 .Dipose 调用,因为我是性能分析新手。
  • Parallel.ForEach 可能是其中的一部分,因为 TPL 有一个启发式方法,可以根据内核确定使用多少线程。您可以设置可能有帮助的关联掩码:stackoverflow.com/questions/14287673/…
  • 如果不需要,请勿使用/调用 Dispose - 仅用于非托管资源。
  • @DavidH - 你如何确定 IDisposable 类是否“不需要处理”?您是否仔细研究每个实现以确保不涉及非托管资源?检查所有可能的派生类?
  • 任何定义为 IDisposable 的东西都应该被处理掉。我只是不想尝试将 Dispose 添加到您自己的课程中。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2013-02-05
  • 2010-10-18
相关资源
最近更新 更多