给出以下代码和运行结果,盼各位指点。。。。。。
对于接口A,抽象类B,一般类C,各自只有一个共同的方法,通过get()方法返回一个值
设计另外三个类:AA实现接口A,BB继承抽象类B,CC继承一般类C
设计test()方法,初始化三个类后,执行各个对象中的get()方法1000000000次,在形如B b = new BB()的前提下,通过b.get()样式运行后时间消耗远远大于通过((BB)b).get()循环的时间消耗,其他几个类似,代码附下
哪位能给出个比较详细的解释吗?
[code="java"]package cn.edu.uestc.dmlab.clusterers.dbscan;
public class InheritancePerformanceTest {
interface A {
public int get();
}
abstract class B {
public abstract int get();
}
class C {
public int get() {return 2;}
}
class AA implements A {
@Override
public int get() {return 1;}
}
class BB extends B {
@Override
public int get() {return 1;}
}
class CC extends C {
@Override
public int get() {return 1;}
}
public void test() {
A a = new AA();
B b = new BB();
C c = new CC();
int s = 1000000000;
long t =System.currentTimeMillis();
System.out.println("--start--");
for (int i = 0; i < s; i++) {
get();
}
System.out.println("this: \t" + (System.currentTimeMillis()-t));
System.out.println("\n- polymorphism -----------");
t =System.currentTimeMillis();;
for (int i = 0; i < s; i++) {
a.get();
}
System.out.println("implements interface: \t"+(System.currentTimeMillis()-t));
t = System.currentTimeMillis();
for (int i = 0; i < s; i++) {
b.get();
}
System.out.println("extends abstract: \t"+ (System.currentTimeMillis()-t));
t = System.currentTimeMillis();
for (int i = 0; i < s; i++) {
c.get();
}
System.out.println("extends class: \t"+ (System.currentTimeMillis()-t));
System.out.println("\n-no polymorphism -----------");
t = System.currentTimeMillis();
for (int i = 0; i < s; i++) {
((AA)a).get();
}
System.out.println("implements interface: \t"+ (System.currentTimeMillis()-t));
t = System.currentTimeMillis();
for (int i = 0; i < s; i++) {
((BB)b).get();
}
System.out.println("extends abstract: \t"+ (System.currentTimeMillis()-t));
t = System.currentTimeMillis();
for (int i = 0; i < s; i++) {
((CC)c).get();
}
System.out.println("extends class: \t"+ (System.currentTimeMillis()-t));
System.out.println("\n--end--");
}
public int get() {
return 1;
}
public static void main(String[] args) {
InheritancePerformanceTest a = new InheritancePerformanceTest();
a.test();
}
}
[/code]
[b]问题补充:[/b]
to jansel:
调换过了也一样,由于结果不在一个数量级,所以先后顺序并不会影响多少。谢谢回答。
[b]问题补充:[/b]
另外,这里并不是突发奇想来测试这个,确实是在编写一个算法的时候感觉到了时间消耗的巨大差军,才专门做这个试验以求根本性解释问题,指导试验,请各位指点。谢谢!
[b]问题补充:[/b]
to qqxiaodi:
请问需要加什么样的“清理语句”呢?谢谢!
to lovewhzlq:
不好意思,我没从那些文章里看出关于这段代码问题的所以然来,麻烦你能不能解释下我的测试为什么有问题呢?谢谢!
[b]问题补充:[/b]
另外,整个实验就在于使用b.get()方法和((BB)b).get()方法的区别,代码顺序可以随便变换,也可以分成两个来测试
由于使用b.get()时间消耗和使用((BB)b).get()差距在5倍以上,所以我觉得跟机器的关系不大,由代码来看,跟垃圾收集也应该没多大关系。
[b]问题补充:[/b]
to walsh:
很奇怪你的测试结果,我当然不会随便测试一下就拿上来请教大家,而是分别在10多台机子上测试了这个程序,无论机子配置好坏,得到的结果都是类似如下的结果(比例类似,绝对值不同)
[quote]--start--
this: 1812
- polymorphism ----------- implements interface: 1782 extends abstract: 8859 extends class: 8578
-no polymorphism -----------
implements interface: 1328
extends abstract: 1344
extends class: 1313
--end--[/quote]
另外,就算你这里关于B的结果不能说明问题,那C的又如何解释呢,甚至A的也不符合你的说法呢?
[b]问题补充:[/b]
to walsh:
不好意思,我没有不相信你的意思,但是我又在8台不同机子上做了同样的测试,整个实验过程近20台机子的测试结果仍然和我上述的结果差不多,我真的不能重复你的实验结果。
整个过程中我最关心的只是b.get()方法和((BB)b).get(),c.get()方法消耗时间多一些可以理解,我不理解的只是b.get()这个抽象方法在继承以后为什么会和c.get()类似。既然你不能重复我的实验结果,而我也不能重复你的实验结果,这个。。。。。难道还有什么其他的问题导致的这个问题啊???看来我还需要继续等待以及测试一下。