gpt4 book ai didi

C# - 使用 Thread.Sleep() 让我的循环每秒运行数百次

转载 作者:太空狗 更新时间:2023-10-29 19:59:44 25 4
gpt4 key购买 nike

我正在开发一个分析实时财务数据的应用程序。目前我的主要计算周期有如下设计:

long cycle_counter=0;
while (process_data)
{
(analyse data, issue instruction - 5000 lines of straightforwasrd code with computations)
cycle_counter++;
Thread.Sleep(5);
}

当我在我的笔记本电脑(一个 Core i5)处理器上运行这个应用程序时,这个周期每秒运行 200-205 次 - 有点符合预期(如果你不关心为什么它每秒运行超过 200 次的话).

但是当我在“真正的”工作站上部署应用程序时,它有 2 个 6 核 Xeon 处理器和 24 GB 的快速 RAM,并且在大约 3 秒内加载 Win7,应用程序每秒运行大约 67 次循环。

我的问题是:

  • 为什么会这样?

  • 在这种情况下,我如何影响每秒的运行次数?

  • 对于每秒运行 200-1000 次循环,是否有更好的解决方案?我现在正在考虑删除 Thread.Sleep() (我在这里使用它的方式受到了很多批评)。有了 12 个内核,我在这个周期中使用一个内核没有问题。但是这种解决方案有一些缺点吗?

谢谢你的想法。

最佳答案

您所采用的方法从根本上是错误的。轮询策略通常是一种糟糕的方法,任何时候你出于“我想将剩余的时间片还给操作系统”以外的原因进行 sleep ,你可能做错了什么。

解决该问题的更好方法是:

  • 为未处理的工作创建一个线程安全队列
  • 创建一个将新工作放入队列的线程
  • 让 n 个线程从队列中取出工作并完成工作。 n 应该是您拥有的 CPU 数量减一。如果您有超过 n 个线程,那么至少有两个线程在消耗 CPU 时间,这会使它们都变慢!
  • 工作线程什么也不做,只是坐在一个循环中,从队列中取出工作并完成工作。
  • 如果队列为空,则“取出工作”阻塞
  • 当新工作到达时,一个被阻塞的线程被重新激活。

如何构建具有这些属性的队列是一个著名的问题,称为生产者/消费者问题。有很多文章介绍如何实现阻塞生产者-消费者队列的许多实现。我建议找到一个现有的调试器,而不是尝试编写自己的;把它做好可能很棘手。

关于C# - 使用 Thread.Sleep() 让我的循环每秒运行数百次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21364501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com