C程序的执行速度突然提高
Posted
技术标签:
【中文标题】C程序的执行速度突然提高【英文标题】:C program's execution speed increases all of the sudden 【发布时间】:2018-10-30 16:26:35 【问题描述】:我编写了一个 C 程序来将温度从华氏温度转换为摄氏温度。当我运行我的程序时,我注意到当循环即将结束时执行速度急剧增加(这不应该按照我的代码)。我试图用不同的值初始化循环,并改变了循环的结束,但行为仍然保持不变。
我附上一张图片并发布执行速度视频的链接。
我提供了视频,因此您可以看到当循环越过 399999 时,执行速度会提高,并且在图像中您可以看到编译器的一些细节/版本。
请告诉我为什么会这样。 谢谢。
Link to the video of execution speed
Link to the image of my ide
我的代码:-
// Program to convert temperature from
// fahrenheit scale to celsius scale.
#include <stdio.h>
main()
float faren, celsius;
for(faren=200000; faren<=900000; faren = faren+20)
celsius = (5.0/9.0)*(faren-32);
printf("%.f\t%3.5f\n",faren, celsius);
【问题讨论】:
我们应该在视频中期待什么,你能在问题中写下这个吗? IDE 的屏幕截图如何与问题相关,您能否在问题中添加所有必要的信息?输入空格字符以在代码列表中创建空格可能会有所帮助。printf
或您的控制台内部可能存在一些谜团。尝试在阈值以下和以上的部分使用perf record
,看看您的时间是否花在不同的地方。
您可以发布相关代码的程序集吗?另外,您是否也在测量printf
的执行时间? printf
执行时间是否在执行 3999999 次后增加,而 celsuis 计算执行时间保持不变?
“当循环即将结束时(不应该按照我的代码)”是什么意思?为什么循环不应该结束?
分而治之!仅使用计算和printf
重复测量。
【参考方案1】:
这只是您的操作系统为此进程分配了更多的 CPU 时间。
在基本术语中,我的意思是非常基本,您的操作系统(在本例中为 Windows)设置了一个具有给定持续时间的计时器,在持续时间结束后,它将更改当前进程并切换到下一个进程。这就是为什么你觉得你的电脑正在一起做几件事,你可以听音乐,也可以浏览网页。 (这个持续时间很短,取决于操作系统)
每当操作系统发现一个进程在给定的持续时间内没有完成时,它只会增加该进程的持续时间,以便下次轮到该进程时它有更多的时间来完成。
现在,当操作系统发现您的进程(正在运行的程序)在第一个持续时间后尚未完成时,下一次它将增加您的进程的持续时间,从而使 CPU 在您的进程上花费更多时间。
这将导致您的程序(它没有任何 CPU 节拍限制,因为它是一个简单的 C/C++ 程序)在一段时间后加速。
【讨论】:
好答案。还有大量其他编译器优化和 CPU 运行时优化,例如分支预测,但在某些时候我们必须记住,这不是在具有固定计算时间片的实时操作系统上运行的,我们不应该期望它会表现像这样。 不错的答案。实际上从这周开始我开始学习 C,而你的答案没有高级术语,这反过来又被我的代码行为所怀疑。 您能否提供有关操作系统反复增加分配给 CPU 绑定进程的量子的任何来源? 另外,这里加速的不是OP的C程序;这是一个简单的程序,可以在很短的时间内轻松生成所有结果。这里系统的负担将是渲染由其他进程处理的窗口。它们不是“完成”的过程;他们响应各种请求,更新他们的窗口并执行其他任务,然后等待更多。在这种情况下,我希望它们受 I/O 限制(等待设备),因此给它们更多 CPU 时间不会加快它们的速度。 除此之外,除非系统中还有其他重要工作正在进行,否则增加一个进程的量程不会给它更多的时间。当系统通常处于空闲状态时,任何新的 CPU 密集型进程都将获得大部分 CPU。它可能会得到一个单元,然后系统会检查,但是,由于系统大部分时间都是空闲的,通常没有其他东西可以运行,所以系统给它两个单元,然后是四个,然后是八个。但如果它只是一个,然后一个,然后一个,它仍然会占据大部分 CPU 时间,因为没有其他东西在竞争它。以上是关于C程序的执行速度突然提高的主要内容,如果未能解决你的问题,请参考以下文章