我分析了我的代码,发现我的类实现了Comparable<T>
,花费了8倍的cpu时间
compareTo(Object)
而不是
compareTo(T)
我认为减速是因为此方法的虚拟表查找。
有没有办法强制函数的静态调用?(就像非虚拟C ++方法一样)
我仍然想使用Comparable<T>
接口,因为我对此对象使用TreeSet
,我不想重写此代码。
编辑:不,我没有实现 compareTo(Object) - 这是由探查器自动生成和报告的
答案 0 :(得分:4)
您看到compareTo(Object)
的原因是Type Erasure。它只是意味着在运行时不再需要类型信息来比较值。
很可能是你减速的原因
1)非常非常大的TreeSet,有很多元素
2) - 更有可能 - 你的compareTo方法做了一些昂贵的事情。因为它经常被调用(通常是n * ln(n)次),所以应该有效地实现它
答案 1 :(得分:2)
不,在这种情况下你不能强制静态调用。
invokespecial
指令可以“非虚拟地”调用实例方法。在编译时已知目标时使用此指令,如构造函数或私有方法。在其他情况下 - 即使目标方法为final
- 也会使用invokevirtual
或invokeinterface
指令。
答案 2 :(得分:1)
由于java在运行时执行not preserve泛型类型,理想情况下它们都应该表现相同。可能还有其他因素导致问题。
答案 3 :(得分:0)
我认为减速是因为 为此进行虚拟表查找 方法
你不应该猜测这是否属实。 只需暂停一下,你就会在行动中抓住它。 完整显示调用堆栈,包括调用库例程。
我的猜测(这可能是错误的)是它经历了9码的OLE式调用hoo-haw。