本文共 846 字,大约阅读时间需要 2 分钟。
从数组大小的疏忽到性能的坟墓:我的一次开发经历
中午的咖啡还没凉,眼皮都快打架了,桌上摆着一杯冰咖啡,屏幕亮起的光芒让我感觉自己快要把眼睛磨出一个圆圈。这个项目可是今天要交的,不能再拖延了!
我一看代码,心一下子沉了下去。原本以为只需要处理2000000条边的无向图,我怎么就把数组的大小搞成2000000了?这不就意味着每条边都会占用一个数组位置,最后索引都到2000000了吗?这真是该死!
我赶紧翻了翻代码,发现自己在初始化数组的时候写的是int edge[2000000];。这下可好,4000000条边的话,肯定要用更大的数组来存。别人家的内存都比我大一倍,根本就不用说,我这就太手残了!
不过,问题就出在这里。原本以为自己能用SPFA算法来处理这么大的图,可现在连初始数组的大小都搞错了,真要是跑了SPFA,估计会直接把主机带黑,整个项目都完了。
我急得快要抓狂了,赶紧重新计算了一下,发现自己本来是需要4000000个边的。可现在初始化的时候,数组只有2000000,根本不够用。修正这个问题,得重新初始化一次边数组,直接用int edge[4000000];,这样才有足够的空间存储所有的边信息。
看着电脑屏幕上闪烁的代码,我的心还是没平静下来。SPFA算法本来就是Bellman-Ford算法的一个优化版,理论上说能更快地处理长图。但是,为什么运行的时候用了7100多毫秒,反而让我感觉好痛苦呢?
我开始检查代码,发现自己在实现过程中有些地方还是不够优化。比如,在处理每条边的时候,虽然用了局部优化,但还是不够快。特别是对于这么大的图,普通的实现可能根本不够用。
最后,我只能硬着头皮把代码重写了一遍,尽量优化了每一步的循环,减少了不必要的操作。结果,虽然性能还是不会满意,但至少比之前好了一点儿。
这次经历让我明白了一个道理:开发的时候,细节决定成败。你可能不会注意到某个小小的数组大小问题,结果等到最后才发现自己把自己搞得措手不及。以后得更加仔细,不能再这样粗心大意了!
转载地址:http://ptsfk.baihongyu.com/