0

有人问我这个问题,在阅读了一些大的 O 资料后,我仍然无法弄清楚这两种设计中哪一种更快。

如果我在一种方法中有这种嵌套循环

public void someMethod(){
    for (a=0;a<10;a++){
     for (b=0;b<10;b++){
      for (c=0;c<10;c++){
       for (d=0;d<10;d++){
       }
      }
     }
    }
}

我决定重新设计该方法并将2个内部for循环放置到另一个类似这样的方法中

public void someMethod(){
     for (a=0;a<10;a++){
         for (b=0;b<10;b++){
          2loopsMethod();
         }
        }
    }

public void 2loopsMethod(){
for (c=0;c<10;c++){
 for (d=0;d<10;d++){
 }
}

}

我的问题是重新设计的方法会比原始代码快很多,因为我将它放在另一种方法中还是没有区别?

4

4 回答 4

8

它应该没有区别。您仍然有四级嵌套循环,因此将部分工作委派给方法调用不会更快。

(从技术上讲,方法调用的额外开销会使第二个示例稍微慢一些,但是如果您的代码正在做任何重要的事情,如果您甚至可以测量差异,我会感到惊讶。)

于 2012-07-08T15:57:45.860 回答
1

大 O 复杂度是一样的。我认为第一个版本更快,因为您没有 a*b 方法调用。理论上方法调用需要额外的时间。

于 2012-07-08T15:58:00.910 回答
1

在您的情况下,重新设计的方法稍微慢一点,因为方法调用需要额外的时间(不太可能,例如 C++ 内联函数)。如果增加循环迭代次数,您肯定会看到差异。

于 2012-07-08T16:02:14.007 回答
0

由于方法上的编译器优化,第二个示例是首选:

public class Try1 {

	static int sum;
	public static void main(String[] args) {

		long startTime, endTime;

		while(true)
		{
			sum = 0;
			startTime = System.nanoTime();
			for (int i = 0; i < 2000; i++) {	
				for (int j = 0; j < 1000; j++) {
					sum = sum + i;
				}
			}
			
			endTime = System.nanoTime();
			System.out.println("no method took:" + (endTime -startTime) );

			sum = 0;
			startTime = System.nanoTime();
			for (int i = 0; i < 2000; i++) {	
				func(i);
			}
			endTime = System.nanoTime();
			System.out.println("with method took:" + (endTime -startTime) );
			
		}

	}

	private static final void func(int i) {
		for (int j = 0; j < 1000; j++) {
			sum = sum + i;
		}
	}

}

结束结果:

未采用方法:3077459 采用方法:2418027 未采用方法:5535578 采用方法:76014 未采用方法:3857167 采用方法:88844 未采用方法:3758701 采用方法:89165 未采用方法:3761588 采用方法:88844

于 2014-11-14T12:46:43.467 回答