`
yanbo
  • 浏览: 21426 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

java泛型是否影响性能

    博客分类:
  • 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 ms 4664.0 ms
4539.0 ms 4567.0 ms
4570.0 ms 4513.0 ms

 

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

无泛型 无泛型
9233.0 ms 9372.0 ms
9237.0 ms 9420.0 ms
9338.0 ms 9428.0 ms

 

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

 

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

 

分享到:
评论

相关推荐

    java泛型学习ppt

    * 潜在的性能收益:泛型为较大的优化带来可能。 使用泛型与不使用泛型的比较: * 不使用泛型:ArrayList al1=new ArrayList(); al1.add(new Integer(10)); Integer i1=(Integer)al1.get(0); // 这里必须做强制类型...

    关于C#、java泛型的看法

    C#的泛型在类型检查和性能方面可能更胜一筹,而Java的泛型则在类型擦除和向后兼容性上有其独特之处。选择哪种语言的泛型取决于具体项目的需求和开发环境。了解并熟练掌握这两种语言的泛型特性,对于提升开发效率和...

    java泛型深入.pdf

    Java泛型是Java语言中用于处理类型安全的一种机制,它允许在编译期间提供类型检查,并在运行时消除了类型转换。Java泛型深入的内容涵盖泛型的基本概念、泛型类、接口、方法以及泛型的使用限制和高级特性。 首先,...

    JAVA泛型详解[参考].pdf

    还有类型擦除,这是Java泛型的一个特性,意味着在运行时,所有的泛型信息都会被移除,因此泛型并不影响程序的性能,但它提供了编译时的类型检查。 在集合框架中,泛型发挥了重要作用。Java的List、Set、Map等集合类...

    java 泛型

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入。泛型允许程序员在代码中使用类型参数,从而增加了代码的类型安全性和重用性。它能够帮助我们避免在运行时出现ClassCastException...

    java泛型详解java泛型详解.doc

    Java 泛型是一种强大的语言特性,它允许在类、接口和方法中使用类型参数,以实现类型的安全性和代码的重用性。泛型是 Java 从 JDK 5.0 版本开始引入的重要特性,目的是增强类型系统,提高程序的类型安全性,减少运行...

    java泛型学习

    总之,Java泛型通过类型检查和类型安全提供了更强大、更安全的代码。类型擦除确保了运行时性能不会因泛型而受到影响,而通配符则提供了处理不确定类型的能力。理解并有效利用这些概念对于编写高效、健壮的Java代码至...

    Java泛型与容器详细笔记.pdf (带书签)

    Java泛型与容器详细笔记涉及到Java编程语言中的两个重要概念:泛型(Generics)和容器(Containers)。容器主要包括Java集合框架中的各类集合类,如List、Set、Map等,它们用于存储和操作数据。泛型则提供了一种类型...

    Java泛型通配符

    Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...

    重新理解Java泛型

    Java泛型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可复用性。本文旨在深入解析Java泛型的各个方面,帮助开发者形成全面、清晰的理解。 1. **泛型基础*...

    Java Generics and Collections (Java泛型与集合)

    Java泛型与集合是Java编程中的核心概念,它们在实际开发中扮演着至关重要的角色。本书"Java Generics and Collections"深入探讨了这两个主题,帮助开发者编写更安全、更高效且可维护的代码。 首先,让我们来理解...

    学士后Java集合框架和泛型课后习题答案

    泛型则是Java 5引入的一项重要特性,它增强了类型安全性和代码可读性,避免了运行时的类型转换异常。 在这个"学士后Java集合框架和泛型课后习题答案"中,我们可以深入理解以下几个关键知识点: 1. **集合接口**:...

    Java中的泛型

    ### Java中的泛型 #### 什么是泛型? 泛型是Java SE 5.0中引入的一项新特性,它允许在程序设计中使用参数化类型,从而实现类型安全的集合类和其他容器类。在使用泛型之前,Java程序员通常依赖于Object类型作为通用...

    java 继承泛型类示例

    泛型引入的主要目的是在编译时期检查类型安全,并且在运行时提供更好的性能。在类定义中使用尖括号()来声明类型参数,例如: ```java public class Container&lt;T&gt; { private T item; public void set(T item) ...

    java泛型的使用

    3. **潜在的性能收益**:虽然Java泛型的初始实现并未直接提升运行时性能,但其为编译器提供了更多的类型信息,为未来JVM的优化提供了可能性。例如,编译器可能能够更有效地处理泛型代码,减少运行时的检查。 4. **...

    java 带两个类型参数的泛型

    在Java编程语言中,泛型是一种强大的特性,它允许我们在类、接口和方法中使用类型参数,从而提高代码的灵活性和可复用性。当我们谈论“java带两个类型参数的泛型”时,这意味着我们正在处理一个泛型类或泛型方法,...

    java零基础自学 之 JAVA泛型

    本文将深入探讨Java泛型的基本概念、好处以及与继承的关系。 首先,让我们理解泛型是如何工作的。在Java中,泛型通过对类型系统进行扩展实现,允许我们创建可以接受不同类型参数的类、接口和方法。类型参数,用尖...

Global site tag (gtag.js) - Google Analytics