在Java中使用泛型会影响性能吗?

Kam*_*ire 21 java generics

从5版开始,泛型一直在Java中.在Java应用程序中使用泛型有什么性能影响,你能解释它们对性能影响的原因吗?

Pet*_*rey 25

泛型是一个编译时功能.它在运行您的应用程序时几乎没有任何影响.

像大多数表演问题; 编写清晰简单的代码更为重要,这通常会带来非常好的性能.

出于性能原因改变设计通常是一个错误,有些人说你永远不应该这样做.我认为在你开始之前考虑性能是值得的,但你必须认识到你有一个相对微不足道的性能问题.

当您更好地了解应用程序的行为时,最好先编写代码并稍后对其进行优化.即当你是真正的用例和分析器.

  • 泛型确实会以运行时类型强制为代价(这有点昂贵),每次拉取使用泛型键入的对象时,都会将其添加到所有代码中实际的性能成本很小,但如果您正在运行,成本就会增加该代码段每秒执行数百万次。 (2认同)

aio*_*obe 12

它是否会影响应用程序的性能以及如何?

不,它不会影响性能,因为它在运行时甚至不存在.

从正式线索:

当实例化泛型类型时,编译器通过称为类型擦除的技术来转换这些类型 - 这是一种编译器删除与类型参数相关的所有信息并在类或方法中键入参数的过程.


正如我在这里所说明的,两个程序都转换为完全相同的字节码:

import java.util.*;

class Test {
    public static void main(String[] args) {
        List<String> l = new ArrayList<String>();
        l.add("hello");
        System.out.println(l.get(0).length());
    }
}
Run Code Online (Sandbox Code Playgroud)

 

import java.util.*;

class Test2 {
    public static void main(String[] args) {
        List l = new ArrayList();
        l.add("hello");
        System.out.println(((String) l.get(0)).length());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ downvoter,为什么要downvote?请证明. (7认同)
  • 不知道他们为什么会投票,但我可以想象有些人(像我一样)会不同意你的解释.您应该比较性能的是MyClass <T>并使用T = String启动它,并且没有泛型的MyClass <String>的直接实现.这在性能方面很重要.通常不多,但是当你在算法的内部循环中使用它们时,这很容易造成高达50%的性能损失,如这个简单的例子所示:http://pastebin.com/QeCW0W1R(我知道它是错误的分析,但只是做了5次,然后5次,测试顺序颠倒了,它总是相同的) (6认同)

Jim*_* T. 6

是的,它确实会影响性能,因为编译器会创建类型转换.

例如:

List<String> strings = ...
String first = strings.get(0);
Run Code Online (Sandbox Code Playgroud)

会变成:

List strings;
String first = (String)string.get(0);
Run Code Online (Sandbox Code Playgroud)

然而,这并不重要,因为在Java具有泛型之前,这是以相同的方式解决的.在Java泛型中,仅在编译时确保类型安全.