um9237 2009-09-02 16:04
浏览 308
已采纳

java的多态会极大影响速度吗?

给出以下代码和运行结果,盼各位指点。。。。。。

对于接口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()类似。既然你不能重复我的实验结果,而我也不能重复你的实验结果,这个。。。。。难道还有什么其他的问题导致的这个问题啊???看来我还需要继续等待以及测试一下。
  • 写回答

10条回答 默认 最新

  • walsh_bupt 2009-09-03 10:58
    关注

    --start--
    this: 2875

    • polymorphism ----------- implements interface: 3625 extends abstract: 1578 extends class: 6313

    -no polymorphism -----------
    implements interface: 2859
    extends abstract: 2828
    extends class: 2891

    --end--

    这个是我公司机子运行的效果,具体原因,我上面已经解释的很清楚了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀