【问题标题】:Most efficient method of performing &&?执行 && 的最有效方法?
【发布时间】:2012-03-29 23:51:29
【问题描述】:

我有一个常见的情况,您有两个变量(xSpeed 和 ySpeed),我想在它们低于 minSpeed 时将它们独立设置为零,并在它们都为零时退出。

什么是最有效的方法?目前我有两种方法(方法2更干净),但我想知道你们是否知道更好的方法......

Method1:

bool isZeroX = Math.abs(xSpeed)< minSpeed;
bool isZeroY = Math.abs(ySpeed)< minSpeed;

if(isZeroX && isZeroY) return -1;
else if(isZeroX) xSpeed = 0;
else if(isZeroY) ySpeed = 0;

Method2:

if(Math.abs(xSpeed)< minSpeed) xSpeed = 0;
if(Math.abs(ySpeed)< minSpeed) ySpeed = 0;
if(ySpeed==0 && xSpeed==0) return -1;

【问题讨论】:

    标签: java flash boolean overhead performance


    【解决方案1】:

    我更喜欢你的第二个例子,因为它是最易读的。优先考虑可读性而不是效率,除非你能证明你应该进行优化。

    【讨论】:

    • 嘿,谢谢 - 但它是一个小应用程序,所以我将成为唯一阅读代码的人。只要我自己理解,效率优先。
    • 不同意。即使在只有您参与的项目中,JIT 的工作也应该是进行这种级别的微优化。
    • @LouisWasserman 我同意。 “我明白了”应该是“我很容易明白,经过 6 个月的时间根本没有考虑它”。
    【解决方案2】:

    你可以的

    if(-minSpread < xSpeed && xSpeed < minSpeed) {
        xSpeed = 0;
        if(-minSpread < ySpeed && ySpeed < minSpeed) {
            ySpeed = 0;
            return -1;
        }
    } else if(-minSpread < ySpeed && ySpeed < minSpeed) {
        ySpeed = 0;
    }
    

    【讨论】:

    • 当然!天才!但是为什么我需要-minSpread。使用 Math.abs 有那么慢吗?
    • Math.abs(int) 会产生一个分支,这是该代码中最昂贵的部分。总体而言,它减少了分支机构的数量。您可以将-minSpread &lt; xSpeed &amp;&amp; xSpeed &lt; minSpeed 合并到一个比较中,但这会使代码几乎不可读,性能差异很小。
    【解决方案3】:

    也许做一个优雅的布尔方法来查看对象是否正在移动/停止:

    boolean isStopped() {
        if(Math.abs(xSpeed)< minSpeed) xSpeed = 0;
        if(Math.abs(ySpeed)< minSpeed) ySpeed = 0;
    
        return (ySpeed==0 && xSpeed==0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2014-08-29
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2015-04-16
      • 2012-12-04
      相关资源
      最近更新 更多