2

我有一个巨大的文本解析 Windows 服务应用程序,通常需要 20 分钟才能完成整个过程,并且消耗 100% 的 cpu。我在循环中每个项目的末尾设置了一个 Thread.Sleep(500),现在 CPU 消耗在 70% 和 0% 之间!!!!大约需要 3 个小时才能完成,这对我的商业案例来说很好。

对某些人来说可能很明显但对我来说不是的问题,为什么延迟使它消耗更少的 CPU?

4

6 回答 6

7

在任务管理器中查看 CPU 使用率时,您实际查看的是给定时间间隔内非 noop 命令的百分比。CPU 的给定核心不能开启 34%。它要么在做某事,要么没有,但它每秒可以来回切换数十亿次。通过插入Sleep命令,结果是 CPU 花费了更多时间什么都不做,即使它有它可以做的工作。当无所事事的时间与做某事所花费的时间一起平均时,使用率低于 100%。如果你睡了更长的时间,但睡得少了,你会看到它在 0 到 100% 之间跳跃(这是真正发生的事情,你目前无法想象它)。

于 2013-02-05T20:11:34.367 回答
6

如果您整天开车,汽车将处于 100% 的使用率。如果你在买完杂货后开车上班前睡觉,下班回家后去俱乐部再睡觉,那么汽车的使用率将低于100%。当您的代码处于休眠状态时,它不起作用。

我应该指出,当需要完成有用的工作时,您应该希望您的 CPU 达到 100%。似乎没有任何充分的理由来减慢工作完成的速度。如果问题是你的系统很慢,那可能意味着它做错了工作,而不是它应该做更少的工作。

于 2013-02-05T20:07:56.620 回答
1

因为睡眠意味着它实际上没有工作——因此几乎没有使用 CPU 时间。它会使程序花费更长的时间,但您不会坐在 CPU 上。

于 2013-02-05T20:08:55.083 回答
1

它平均下来。实际上,您的处理器将重复此循环,直到完成对文件的解析:

  • 100% CPU 负载读取内容
  • 0% CPU 负载,休眠 500ms

一遍又一遍地快速重复,您的进程监视器将平均为 70%。

于 2013-02-05T20:12:51.417 回答
0

Thread.sleep 不会导致 CPU 使用。在多线程环境中,执行 long Thread.sleep 会导致系统产生更多线程以供使用,而不是重用已经创建的线程。该过程非常昂贵,因此 CPU 使用率很高。这就是你的情况。您可以通过创建一个 while 循环并创建新线程并让它们依次在 sleep.cpu 中创建一个线程来确认。cpu 使用率将达到 100%

于 2015-01-19T14:07:27.740 回答
0

假设您需要数到 1,000,000。您开始编号非常快,并在 1 天内完成任务。如果达到每千人时停止 10 秒会怎样?你会:

  1. 很久以后完成

  2. 但是,您有 10 秒的“睡眠”时间;在这段时间里,除了数数之外,您还可以考虑其他事情(或什么都没有:)),这样您的任务就不会消耗您 100% 的注意力。

顺便说一句,你的问题听起来更像是一个逻辑问题而不是编程问题......

于 2013-02-05T20:16:38.763 回答