【问题标题】:C#: Create CPU Usage at Custom PercentageC#:以自定义百分比创建 CPU 使用率
【发布时间】:2009-08-22 10:10:32
【问题描述】:

我希望在某些 CPU 使用条件下在几台机器上测试系统响应能力等。不幸的是,我只能创建 ~100% 的使用率(无限循环)或没有足够的 CPU 使用率(我正在使用 C#)。

有什么方法可以粗略地估算,因为其他任务也在系统上运行,以 20%、30%、40%(等等)的步长人为地创建 CPU 使用率?

我了解系统之间存在差异,显然,因为 CPU 的不同。它更多的是关于可定制 CPU 密集型计算的算法/想法,这些计算在当前 CPU 上创造足够的使用率,而不会最大化它,我可以对其进行调整,然后以某种方式调整它们以创建所需的百分比。

【问题讨论】:

    标签: c# .net performance


    【解决方案1】:

    然后呢?

        DateTime lastSleep = DateTime.Now;            
        while (true)
        {
            TimeSpan span = DateTime.Now - lastSleep;
            if (span.TotalMilliseconds > 700)
            {
                Thread.Sleep(300);
                lastSleep = DateTime.Now;
            }
        }
    

    您可以使用较小的数字来获得更稳定的负载....只要比率是您想要的。但这确实只使用一个内核,因此您可能必须在多个线程中执行此操作。

    【讨论】:

      【解决方案2】:

      您可以添加一个线程定时器,它会在一定时间间隔内唤醒并执行一些工作。然后调整工作间隔和工作量,直到接近所需的负载。

          private void button1_Click(object sender, EventArgs e)
          {
              m_timer = new Timer(DoWork);
              m_timer.Change(TimeSpan.Zero, TimeSpan.FromMilliseconds(10));
          }
      
          private static void DoWork(object state)
          {
              long j = 0;
              for (int i = 0; i < 2000000; i++)
              {
                  j += 1;
              }
              Console.WriteLine(j);
          }
      

      通过调整循环的值,我能够为我的系统增加 20%、60% 和满负荷。它将使用额外的线程扩展到多个内核以实现更均匀的负载。

      【讨论】:

        【解决方案3】:
        【解决方案4】:

        这是一个函数,它利用所有可用的处理器/内核达到可自定义的百分比,并且可以随时被调用代码取消。

        private static CancellationTokenSource StressCPU(int percent)
        {
            if (percent < 0 || percent > 100) throw new ArgumentException(nameof(percent));
            var cts = new CancellationTokenSource();
            for (int i = 0; i < Environment.ProcessorCount; i++)
            {
                new Thread(() =>
                {
                    var stopwatch = new Stopwatch();
                    while (!cts.IsCancellationRequested)
                    {
                        stopwatch.Restart();
                        while (stopwatch.ElapsedMilliseconds < percent) { } // hard work
                        Thread.Sleep(100 - percent); // chill out
                    }
                }).Start();
            }
            return cts;
        }
        

        使用示例:

        var cts = StressCPU(50);
        Thread.Sleep(15000);
        cts.Cancel();
        

        结果:

        【讨论】:

          【解决方案5】:

          没有这样做 - 但您可以尝试计算在多个程序中运行的优先线程。

          【讨论】:

            【解决方案6】:

            当您尝试使用睡眠时,您是这样做还是只是将睡眠放入实际循环中? 我认为这会奏效。

            while(true)
            {
              Thread.Sleep(0);
              for(int i=0;i<veryLargeNumber; i++)
              {
                  //maybe add more loops here if looping to veryLargeNumber goes to quickly
                  //also maybe add some dummy operation so the compiler doesn't optimize the loop away
              }
            }
            

            【讨论】:

              猜你喜欢
              • 2020-11-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-02-07
              • 2012-08-14
              • 2015-07-28
              • 2022-01-26
              • 2011-10-10
              相关资源
              最近更新 更多