通用类型和性能

时间:2011-02-08 10:02:39

标签: java performance generics

我想知道在整个程序中使用泛型类型是否会对应用程序产生任何(显着)降级性能影响。我使用了很多集合对象(列表,集合,映射)并为应用程序提供了更好的灵活性(此应用程序必须集成到其他应用程序中)我只使用泛型类型而不是参数化它们。这是一种常见的做法,还是有人有建议/建议?是否会有任何显着的性能下降?

提前致谢,

6 个答案:

答案 0 :(得分:10)

根本没有性能下降,因为泛型实际上是“编译时技巧”。

编译器使用此信息来拒绝某些类型不安全的做法,否则这些做法会在运行时出现,如果不使用泛型的话。在运行时期间,仅使用原始类(即通用参数的上限),因此性能将与使用泛型的 not 相同,并且只是自己编译类。

答案 1 :(得分:3)

正如其他贡献者所解释的那样,在大多数情况下,使用泛型不会对性能产生任何影响。唯一的性能问题是当您必须用其对象类型替换基本类型时(例如,如果您需要将int作为通用参数传递。

但是,除非您对对象进行大量使用,否则性能损失不可见。因此,您应该从泛型开始,如果出现由于此特定情况导致的性能问题,您仍然可以使用基元类型替换您的通用对象。早期优化是邪恶的。

答案 2 :(得分:2)

通用类型是私有类型安全(任何类型转换问题将在编译时出现而不是运行时),并且基本上是编译器的指令,它们被进一步“擦除”( erasure )并且在运行时期间不会以该形式出现(它们被显式强制转换替换)。因此,没有性能损失。

答案 3 :(得分:1)

使用泛型对性能或内存消耗没有显着影响。

最简单的证明是通用类型信息通常在运行时不可用。这意味着当存在泛型类型信息时,JVM的工作方式完全相同,就好像没有。

仅使用原始类型“提供灵活性”是灾难的一种方法,因为您没有关于集合的类型信息,因此可以传递任何类型的对象,即使您的代码不准备处理它(即如果你的代码需要一个String个对象的集合,但是它传递了一个带有Integer的集合,它将抛出一个ClassCastException。有了(正确实现的)泛型它会是编译时错误。)

答案 4 :(得分:0)

您对泛型的所有定义仅限于设计时间。编译程序后,JVM将通过强制转换替换所有定义。与对类进行编码以包含从一开始就需要的正确类型并因此避免强制转换相比,这在性能上有很小的降低。

但性能下降很小,我强烈建议您在适当时使用泛型来提高代码的可读性和可重用性。你当然可以考虑这个,如果你有一个EXTREME类的大量使用方法来执行这些隐式转换并且你遇到了性能问题。虽然不是之前; - )。

答案 5 :(得分:0)

通常,不,这都是编译时间的魔力。在某些情况下,可能存在隐藏的运行时成本。

   class A<T>
1     void f(T arg)

   class B extends A<String>
2     void f(String arg)

   A<String> a = new B();
3  a.f("blah");

第3行将调用方法2。但是,它首先调用方法1,但方法2不是传统的“重写”方法1,签名是不同的。 Javac必须桥接这两者,并且在运行时从方法1到方法2都有成本。

通过JVM方法内联可以将成本优化为零。