这段代码运行这么慢正常吗?
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 >= x-3)
怎么退出,如果x
没有被修改并且radar_x
只是增加了?除非您等待 int 溢出,否则这确实需要相当长的时间。
好吧,它有多“慢”?具体执行需要多长时间?为什么你期望它比实际运行得更快?
它可能运行得很快,但有很多迭代要做...while(radar_x >= x-3)
循环的 16 * 19 *“无限”迭代。
我认为while (radar_x >= x-3)
是指while (radar_x <= x)
。
【参考方案1】:
它还没有完成的原因是因为它在技术上永远不会停止。第三个 while 循环设置为永远递增 radar_x
,没有上限。这是一个容易犯的错误。
只需将其更改为 while (radar_x <= 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
循环。
你不能说循环不是无限的。如果它在具有饱和算法的处理器上运行怎么办?未定义有符号溢出。以上是关于这段代码运行这么慢正常吗?的主要内容,如果未能解决你的问题,请参考以下文章
linux下的eclipse运行,怎么这么慢,编译运行都很卡,我的是c++开发环境的,求指导