Performance 在程序中控制计算速度

Performance 在程序中控制计算速度,performance,Performance,我们的一位同志向超级用户询问了一个可以任意占用CPU时间的应用程序。它激起了我的兴趣 我的问题是,如何提出这种申请: 以下是我的一些总体想法以及我认为这些想法不好的原因: 可以编制一个计算程序,该程序将使用效率低下的算法。该选项的问题是应用程序基本上只有一个档位。为了解决这个问题,我们需要几种效率低下的算法,以便提供多个齿轮。尽管如此,用户还是无法选择,比如说50%的利用率。他必须选择一种算法,看看它在他的计算机上的表现。 应用程序可以使用一个工作线程来创建,该线程将不时设置为睡眠。通过这种方式

我们的一位同志向超级用户询问了一个可以任意占用CPU时间的应用程序。它激起了我的兴趣

我的问题是,如何提出这种申请:

以下是我的一些总体想法以及我认为这些想法不好的原因:

可以编制一个计算程序,该程序将使用效率低下的算法。该选项的问题是应用程序基本上只有一个档位。为了解决这个问题,我们需要几种效率低下的算法,以便提供多个齿轮。尽管如此,用户还是无法选择,比如说50%的利用率。他必须选择一种算法,看看它在他的计算机上的表现。 应用程序可以使用一个工作线程来创建,该线程将不时设置为睡眠。通过这种方式,用户可以控制每次执行之间的线程休眠时间,并控制CPU利用率。然而,虽然平均利用率是可控的,但在某一时刻线程要么处于休眠状态,要么正在消耗资源,所以这不是很好的解决方案。 这将是第一号的变体。应用程序可能以这样的方式进行,即利用缓存未命中或Java中的推测编译。例如,可以创建一个循环来控制计算,并使其以用户设置的间隔使缓存未命中。这将减慢计算速度,但很难实现。或者在Java中,可以使用JIT优化。带有条件的循环将以JIT优化条件的方式执行。一旦达到条件,JIT就必须对代码进行去优化并执行它。但是,如果它同时存储代码的优化版本和未优化版本,那么它只能工作一次。同样,类似的东西需要大量的Java优化知识才能工作。 关于如何使程序故意变慢,还有其他想法吗


<>我主要是考虑在C、C++、C或java中实现这样的事情,但是我担心C或java可能会对这种问题的级别太高。p> 我不知道这是否可行,但作为第一次尝试,我将尝试编写一个烧坏CPU的应用程序,并在该烧坏循环中监视其CPU使用情况,生成其时间片以降低CPU使用率,以在平均使用率超过目标百分比时进行补偿

例如:

while (true)
{
    double cpuUtilization = GetCpuUtilization();
    if (cpuUtilization > 0.5)
    {
        Thread.Sleep(0);
    }
}

这里可能有一些我没有考虑过的警告,但这是我脑子里想不到的。有一件事,您可能需要在一个单独的线程中为系统中的每个CPU核心运行一个循环,因此一个四核系统可能应该有四个线程,每个线程运行上述循环。

假设一个线程和一个核心,在任何纳秒,线程要么100%执行某项操作,要么等待0%。部分CPU利用率只能作为运行和不运行之间的平均时间。所以,基本上,要得到50%,就让它睡一半的时间。睡眠的时间长短取决于你。

这是一个非常有趣的问题。我忍不住想,天哪,我应该是这方面的专家。。。。太糟糕了,我的慢代码不是故意劳动的结果。我希望我能帮忙。8@duffymo是的,这就是我问的原因。我见过的所有CPU烧录机都尽最大努力实现100%的利用率。我记得在DOS时代,有一个叫做MoSlow的程序,或者类似的程序,它使旧的DOS游戏在新电脑上运行得足够慢,但我还没有看到现代操作系统有类似的功能。相关:这似乎是由操作系统等外部调度器提供的一项任务,用于指定要为给定进程提供多少个时间片。@AndrejaKo:如果调度器支持,那么您只需告诉它这是我的进程,在CPU上给它正好一半的时间片即可。如果它不支持,那就自己写吧,这基本上是你的第二个选择@Mike Dunlavey的建议。这是开始的好主意,但它仍然是停止-开始。当然,利用率仪表使其成为可用的解决方案,特别是如果它经过微调的话;但我更想看看是否还有其他方法可以做到这一点。@AndrejaKo:在单个内核中,停止-启动是唯一的方法。