我在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:感谢所有评论!我想是因为这个事件被“炒了很多”,所以我的代码可能会有一股难闻的气味。虽然我没有想过缓存等。
答案 0 :(得分:3)
显然不是,因为你必须来到这里并且无法注意到你的节目实际表现有所不同。 :)
关键是,除非它不符合您的性能要求,否则不值得优化。
在任何情况下,与例如分支相比,进行额外分配与分支的性能差异完全可以忽略不计。生成和处理鼠标移动事件所花费的时间。
考虑一下(简化):
那你为什么担心作业或分支中有几纳秒的差异?只是方法调用本身的堆栈清理代码会使你的任务相形见绌。
编辑:顺便说一句,这是一篇有点过时但仍然有效的关于微调的好文章: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会导致更改页面并导致缓存抖动。它发生了,但如果你处于那种情况,你很可能已经意识到潜在的问题。