读书人

java泛型是不是影响性能

发布时间: 2012-09-15 19:09:28 作者: rapoo

java泛型是否影响性能

今天公司有个同事,说泛型影响性能,不用泛型的话,性能高七倍,对此,我深表怀疑,于是自己动手,测试了一下,测试并不严谨,大家见谅

?

测试代码如下,为了防止java虚拟机对foreach或者对迭代器有特殊优化,所以采用最原始的for循环,同时为了防止基本类型拆装箱影响测试结果,采用了我项目里一个很简单的bean。

这个是有泛型的类:

?

package com.test;import java.util.ArrayList;import java.util.List;import com.mobcent.aca.domain.DeveloperApp;public class GenericTest implements Runnable {    Thread thread = new Thread(this);    public void start() {        thread.start();    }    public void run() {        // TODO Auto-generated method stub        double total = 0;        for (int i = 0; i < 10000; i++)            total = total + Generic();        System.out.println("Generic: " + total + " ms");    }    public long Generic() {        long start = System.currentTimeMillis();        List<DeveloperApp> v = new ArrayList<DeveloperApp>();        for (int i = 0; i < 10240; i++) {            v.add(new DeveloperApp());        }        for (int i = 0; i < 10240; i++) {            DeveloperApp j = v.get(i);        }        long end = System.currentTimeMillis();        return end - start;    }}

?这个是没有泛型的类package com.test;

?

import java.util.ArrayList;import java.util.List;import com.mobcent.aca.domain.DeveloperApp;public class NonGenericTest implements Runnable {    Thread thread = new Thread(this);    public void start() {        thread.start();    }    public void run() {        // TODO Auto-generated method stub        double total = 0;        for (int i = 0; i < 10000; i++)            total = total + NonGeneric();        System.out.println("NonGeneric: " + total + " ms");    }    public long NonGeneric() {        long start = System.currentTimeMillis();        List v = new ArrayList();        for (int i = 0; i < 10240; i++) {            v.add(new DeveloperApp());        }        for (int i = 0; i < 10240; i++) {            DeveloperApp j = (DeveloperApp) v.get(i);        }        long end = System.currentTimeMillis();        return end - start;    }}
?

?

以下是测试结果

有泛型无泛型4595.0 ms4664.0 ms4539.0 ms4567.0 ms4570.0 ms4513.0 ms

?

然后还测试了以下同时两个线程的情况,进行对比:

无泛型无泛型9233.0 ms9372.0 ms9237.0 ms9420.0 ms9338.0 ms9428.0 ms

?

我的测试不是很严谨,随手做的小测试。

?

至于原因,我想大家应该大部分都知道。泛型仅仅是java的语法糖,它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,所以网上说java用泛型比不用泛型速度慢7倍纯属无稽之谈,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的.

?

读书人网 >编程

热点推荐