这段代码运行这么慢正常吗?

Posted

技术标签:

【中文标题】这段代码运行这么慢正常吗?【英文标题】:Is normal this code run SOO slow? 【发布时间】:2014-05-26 21:31:07 【问题描述】:

看看我的代码,它像乌龟一样运行缓慢,我在第四代 i7 下运行它......而且炫耀结果真的很慢。有人有一个想法吗?或者这应该是一个非常缓慢的执行!?

PS:脚本的目的是找到四个相邻数字在同一方向上的最大乘积,实际上在这段代码中我只寻找向上的一个

#include <stdio.h>
#include <math.h>

int main()

        int A[20][20] = 
        8,02,22,97,38,15,00,40,00,75,04,05,07,78,52,12,50,77,91,8,
        49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,04,56,62,00,
        81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,03,49,13,36,65,
        52,70,95,23,04,60,11,42,69,24,68,56,01,32,56,71,37,02,36,91,
        22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,
        24,47,32,60,99,03,45,02,44,75,33,53,78,36,84,20,35,17,12,50,
        32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,
        67,26,20,68,02,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21,
        24,55,58,05,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,
        21,36,23,9,75,00,76,44,20,45,35,14,00,61,33,97,34,31,33,95,
        78,17,53,28,22,75,31,67,15,94,03,80,04,62,16,14,9,53,56,92,
        16,39,05,42,96,35,31,47,55,58,88,24,00,17,54,24,36,29,85,57,
        86,56,00,48,35,71,89,07,05,44,44,37,44,60,21,58,51,54,17,58,
        19,80,81,68,05,94,47,69,28,73,92,13,86,52,17,77,04,89,55,40,
        04,52,8,83,97,35,99,16,07,97,57,32,16,26,26,79,33,27,98,66,
        88,36,68,87,57,62,20,72,03,46,33,67,46,55,12,32,63,93,53,69,
        04,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36,
        20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,04,36,16,
        20,73,35,29,78,31,90,01,74,31,49,71,48,86,81,16,23,57,05,54,
        01,70,54,71,83,51,54,69,16,92,33,48,61,43,52,01,89,19,67,48;

        int x = 0 ,y = 0, radar_x = 0,radar_y = 0,maior = 0,produto = 1;


        while(x<=19)
                while(y<=19)
                        printf("%d %d \n",x,y);
                        // verredura pra cima
                        if(x - 3 >= 0)
                                radar_x = x-3;
                                while(radar_x >= x-3)
                                        produto*=A[x][y];
                                        radar_x ++ ;
                                

                        
                        if(produto > maior)
                                maior = produto;
                        produto = 1;
                        y++;
                
                y=0;
                x++;
        

        printf("%d",maior);


        return 0;


【问题讨论】:

三个嵌套的while循环可能是原因之一。 我不明白while(radar_x &gt;= x-3) 怎么退出,如果x 没有被修改并且radar_x 只是增加了?除非您等待 int 溢出,否则这确实需要相当长的时间。 好吧,它有多“慢”?具体执行需要多长时间?为什么你期望它比实际运行得更快? 它可能运行得很快,但有很多迭代要做...while(radar_x &gt;= x-3) 循环的 16 * 19 *“无限”迭代。 我认为while (radar_x &gt;= x-3)是指while (radar_x &lt;= x) 【参考方案1】:

它还没有完成的原因是因为它在技术上永远不会停止。第三个 while 循环设置为永远递增 radar_x,没有上限。这是一个容易犯的错误。

只需将其更改为 while (radar_x &lt;= x) 即可解决问题。

【讨论】:

有效!!非常感谢您和其他提供帮助的人!【参考方案2】:

检查内部 for 循环(写为 while):

radar_x = x-3;
while(radar_x >= x-3)
    produto*=A[x][y];
    radar_x ++ ;

radar_x >= x-3 第一次为真.. 然后radar_x 递增...所以这可能会循环直到发生溢出,递增INT32_MAX (2147483647),此时radar_x 突然

每次开始进行乘法运算时,您至少循环了 20 亿次。

实际行为被低估,编译器编写者有权说“程序不是 C”,因此如果您可能溢出任何附加项,应在执行 a += b 之前测试“a

【讨论】:

而有符号整数溢出是未定义的行为,优化器可能只是完全消除条件,形成真正的无限循环。 是的,理论上编译器可以做任何事情;在您确信程序正确之前不要打开优化器的理由。它可以决定,利用“未定义的行为”,根本不循环并跳过该部分会更快。 信息“炫耀结果真的很慢”表明它确实终止了,所以我想我会解释为什么它很慢。到我发帖的时候,已经有 2 个其他答案了! 回答前 6 分钟的评论说“仍在运行”。所以不知道它是否会终止。 但我在回答这个问题.. cmets 是后来写的 :) 并不是很重要,整数会在此类错误上发生(缓慢).. 一旦我在 64 位上看到一个错误一个 NTP 时间守护程序端口,它出现是因为溢出需要非常长的时间【参考方案3】:

这部分代码,

radar_x = x-3;
while(radar_x >= x-3)
   produto*=A[x][y];
   radar_x ++ ;

导致一个很长的循环(可能无限,可能未定义,可能取决于您的编译器),因为 x 没有被修改,radar_x 只是递增

要获得[x - 3, x] 中4 项的乘积,我可能会更简单地这样做:

for (int radar_x = 0; radar_x < 4; radar_x++) 
    produto*=A[x - radar_x][y];

编辑

删除已经给出的答案,只留下替代循环

【讨论】:

是的,我看到了忍者编辑,您根据建筑师的回答(和查尔斯的评论)颠倒了比较... 是的,我是忍者。我并没有太在意那个循环(我可能会删除它)。为了清楚起见,我更喜欢for @BenVoigt:charles 的评论是怎么回事? 忍者编辑是被允许和鼓励的,只要你最终得到正确的答案。我同意 OP 需要学习如何编写 for 循环。 你不能说循环不是无限的。如果它在具有饱和算法的处理器上运行怎么办?未定义有符号溢出。

以上是关于这段代码运行这么慢正常吗?的主要内容,如果未能解决你的问题,请参考以下文章

我的 SQL 查询这么慢正常吗?

为啥我的代码这么慢?

linux下的eclipse运行,怎么这么慢,编译运行都很卡,我的是c++开发环境的,求指导

我可以让一些代码像守护进程一样在 Django 中不断运行吗

tf.linalg.eigh在GPU上非常慢 - 正常吗?

为啥 Tkinter 窗口打开这么慢?