提高可比性<t>比较性能</t>

时间:2009-03-10 16:36:22

标签: java performance comparable virtual-method

我分析了我的代码,发现我的类实现了Comparable<T>,花费了8倍的cpu时间

compareTo(Object)

而不是

compareTo(T)

我认为减速是因为此方法的虚拟表查找。


有没有办法强制函数的静态调用?(就像非虚拟C ++方法一样)

我仍然想使用Comparable<T>接口,因为我对此对象使用TreeSet,我不想重写此代码。


编辑:不,我没有实现 compareTo(Object) - 这是由探查器自动生成和报告的

4 个答案:

答案 0 :(得分:4)

您看到compareTo(Object)的原因是Type Erasure。它只是意味着在运行时不再需要类型信息来比较值。 很可能是你减速的原因 1)非常非常大的TreeSet,有很多元素 2) - 更有可能 - 你的compareTo方法做了一些昂贵的事情。因为它经常被调用(通常是n * ln(n)次),所以应该有效地实现它

答案 1 :(得分:2)

不,在这种情况下你不能强制静态调用。

invokespecial指令可以“非虚拟地”调用实例方法。在编译时已知目标时使用此指令,如构造函数或私有方法。在其他情况下 - 即使目标方法为final - 也会使用invokevirtualinvokeinterface指令。

答案 2 :(得分:1)

由于java在运行时执行not preserve泛型类型,理想情况下它们都应该表现相同。可能还有其他因素导致问题。

答案 3 :(得分:0)

  

我认为减速是因为   为此进行虚拟表查找   方法

你不应该猜测这是否属实。 只需暂停一下,你就会在行动中抓住它。 完整显示调用堆栈,包括调用库例程。

我的猜测(这可能是错误的)是它经历了9码的OLE式调用hoo-haw。