Inside or Outside the loop

今天遇到一个有趣的 bug,仅仅移动两行代码的位置,就导致性能有巨大的差异。这种 bug 如果不是亲身经历,估计很难体会到其中的奥妙。由于此种 bug 不会导致错误的结果,所以很难debug。
真是应了古话,上得山多终遇虎。不多写点代码,真的遇不到这种有趣的 bug。
正因为如此,姑写文以记之。

Bug:在 for loop 中 initialize object
下面代码中,for loop 80000+, initialize 一个 bfs 需要同等多次的 for loop.

Note: 谨记能够放在 Loop 外面的代码,尽量放在外面,否则耗费资源,both time and resources.

public int ancestor(int v, int w) {
        int ant = -1;
        int len = Integer.MAX_VALUE;
        //下面两行代码被放到了 for loop 中
        BreadthFirstDirectedPaths bfsV = new BreadthFirstDirectedPaths(G, v);
        BreadthFirstDirectedPaths bfsW = new BreadthFirstDirectedPaths(G, w);

        for(int i = 0; i < G.V(); i++) {

             //BreadthFirstDirectedPaths bfsV = new BreadthFirstDirectedPaths(G, v);
        BreadthFirstDirectedPaths bfsW = new BreadthFirstDirectedPaths(G, w);
            //
            if (bfsV.hasPathTo(i) && bfsW.hasPathTo(i)) {
                int distV = bfsV.distTo(i);
                int distW = bfsW.distTo(i);
                int sum = distV + distW;
                if(sum < len) {
                    len = sum;
                    ant = i;
                }
            }
        }
        return ant;
    }

Initialize a BreadthFirstDirectedPaths

public BreadthFirstDirectedPaths(Digraph G, int s) {
        marked = new boolean[G.V()];
        distTo = new int[G.V()];
        edgeTo = new int[G.V()];
        for (int v = 0; v < G.V(); v++)
            distTo[v] = INFINITY;
        validateVertex(s);
        bfs(G, s);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容