将对象多次设置为null会对性能产生影响吗?

时间:2013-11-04 18:46:36

标签: java

我在java中制作一个使用鼠标后面的“尾巴”的游戏。我使用MouseMotionListener并使用mouseDragged(MouseEvent e)函数将鼠标的位置添加到数组中。

因此只要触发mouseDragged(MouseEvent e)函数,它就应该将当前鼠标位置添加到数组中,当拖动停止时,应该清除该数组。

我的想法是使用mouseMoved(MouseEvent e)函数将数组设置为null。我可以这样做:

public void mouseMoved(MouseEvent e) {
    if(myTailArray != null) {
        myTailArray = null;
    }
}

或者就像这样:

public void mouseMoved(MouseEvent e) {
    myTailArray = null;
}

最后一个方法意味着myTailArray将被设置为多次无效。但它在性能上有所不同吗?

编辑:为了清楚起见,我知道当拖动后鼠标没有移动时,这可能会导致错误。我使用MouseListener来重置鼠标的按下和释放,但我只是好奇。

EDIT2:感谢所有评论!我想是因为这个事件被“炒了很多”,所以我的代码可能会有一股难闻的气味。虽然我没有想过缓存等。

5 个答案:

答案 0 :(得分:3)

显然不是,因为你必须来到这里并且无法注意到你的节目实际表现有所不同。 :)

关键是,除非它不符合您的性能要求,否则不值得优化。

在任何情况下,与例如分支相比,进行额外分配与分支的性能差异完全可以忽略不计。生成和处理鼠标移动事件所花费的时间。

考虑一下(简化):

  1. 用户决定移动鼠标。
  2. 用户大脑通过钠/钾反应链向手臂和手上的肌肉发送电脉冲。
  3. 肌肉运动的力量克服了鼠标在桌子上的摩擦,鼠标移动。
  4. 光学鼠标在桌面上对图像进行采样,比较硬件中的连续图像并计算偏移量。
  5. 通过USB序列化和发送移动数据,发生各种同步。
  6. 生成和处理硬件中断,读取,缓冲传入数据,发送给适当的驱动程序。
  7. 鼠标位置已更新。通过blitting和修改视频内存中的数据块重新绘制光标。
  8. 窗口系统检查其窗口,检查鼠标状态并将事件分派给同步的线程队列。
  9. Swing窗口接收本机事件,检查自己的内部状态,转换为Swing事件并通过对象树调度消息,最终导致...
  10. 您的鼠标移动处理程序被调用。
  11. 那你为什么担心作业或分支中有几纳秒的差异?只是方法调用本身的堆栈清理代码会使你的任务相形见绌。

    编辑:顺便说一句,这是一篇有点过时但仍然有效的关于微调的好文章:http://www.onjava.com/pub/a/onjava/2002/03/20/optimization.html

    其中一个关键点是“在开始调整之前始终设置目标,以便您知道何时停止。”这篇文章不仅有一个很好的案例研究,你可以使用它,它完成了一个通用程序的很好的概述:识别瓶颈,设置目标,测试,配置文件,并相应地进行优化。

答案 1 :(得分:2)

这种事情是微观优化,你不应该关注自己。如果存在差异,即使该方法被调用数千次,也可以忽略不计。它甚至可能不是您期望的差异:取决于值为空或非空的频率,添加的分支指令可能超过冗余分配(分支在许多体系结构上相对昂贵)。

一般来说,试图在没有表现出真实性能问题的情况下优化此类事情会适得其反。

答案 2 :(得分:2)

设置非易失性实例变量需要的时间可以忽略不计:它只是一个本地CPU缓存写操作,没有任何昂贵的内存屏障指令。根据具体情况,JIT编译器可能会完全消除某些写操作。

但是,为了正确看待这些事情,我应该补充一点,我们正在讨论0.5 ns与10 ns最差情况下的完整volatile写入。只需调用该方法可能比写入本身花费更多时间。鼠标最多每秒生成100个报告 - 在每个挂钟时间内,100 x 10ns =1μs的时间(最坏情况!)。

答案 3 :(得分:0)

如果它有任何影响你无论如何都不会注意到它。

但是没有if语句的版本应该“更快”,因为比较比赋值更昂贵。 (我记得从uni虽然找不到任何参考证明它)

答案 4 :(得分:0)

第二种(通常是首选的)方法较慢的唯一情况是在强烈的多线程环境中,冗余设置为null会导致更改页面并导致缓存抖动。它发生了,但如果你处于那种情况,你很可能已经意识到潜在的问题。