gpt4 book ai didi

java - 如果只使用两次,创建一个新的对象引用会不会更快?

转载 作者:行者123 更新时间:2023-11-30 09:26:51 24 4
gpt4 key购买 nike

我有一个关于指令优化的问题。如果一个对象要在两个语句中使用,是创建一个新的对象引用更快还是我应该在两个语句中直接调用该对象?

就我的问题而言,该对象是对象的 Vector 的一部分(此示例来自没有 ArrayLists 的精简版 Java)。这是一个例子:

AutoEvent ptr = ((AutoEvent)e_autoSequence.elementAt(currentEventIndex));
if(ptr.exitConditionMet()) {currentEventIndex++; return;}
ptr.registerSingleEvent();

AutoEvent 是相关类,e_autoSequence 是 AutoEvent 对象的 VectorAutoEvent 包含两个有问题的方法:exitConditionMet()registerSingleEvent()

因此,这段代码也可以写成:

if(((AutoEvent)e_autoSequence.elementAt(currentEventIndex)).exitConditionMet()) 
{currentEventIndex++; return;}
((AutoEvent)e_autoSequence.elementAt(currentEventIndex)).registerSingleEvent();

这个比上面的快吗?

我知道类型转换过程很慢,所以这个问题实际上是双重的:另外,如果我不类型转换物体,哪个会更优化?

请记住,这仅用于相关对象的两种用途。

最佳答案

第一个解决方案全面更好:

  • 只调用 vector elementAt方法。这实际上是这里最昂贵的操作,因此只执行一次即可获得不错的性能。同时执行两次可能会使您面临某些竞争条件。
  • 只有一次转换操作。强制转换在现代 JVM 上的成本非常低,但仍有少量成本。
  • 恕我直言,它更具可读性。你得到一个对象然后用它做两件事。如果你得到了两次,那么读者必须在心里弄清楚你得到的是同一个对象。最好只获取一次,然后将其分配给一个有好名字的变量。
  • 局部变量的单次赋值(如第一个解决方案中的 ptr)非常便宜而且通常免费 - Java JIT 编译器足够智能,可以生成高度优化的代码。

附言Vector已经过时了。考虑转换为 ArrayList<AutoEvent> .通过使用通用的 ArrayList,您不需要显式转换,而且它比 Vector 快得多(因为它不是同步的,因此锁定开销较小)

关于java - 如果只使用两次,创建一个新的对象引用会不会更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14825172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com