Java 是"&燃气轮机=&引用;尽可能快地测试==&引用;测验

Java 是"&燃气轮机=&引用;尽可能快地测试==&引用;测验,java,optimization,Java,Optimization,我正在开发一个hexgrid程序,需要测试角度是否正确 低于30度 等于30度 在30到60度之间 等于60度 大于60度 我有 public int TestA(double angle) { if(angle<=30) { if(angle==30) return ANGLE_EQUALS_30; else return ANGLE_LESS_THAN

我正在开发一个hexgrid程序,需要测试角度是否正确

  • 低于30度
  • 等于30度
  • 在30到60度之间
  • 等于60度
  • 大于60度
  • 我有

    public int TestA(double angle)
    {
        if(angle<=30)
            {
                if(angle==30)
                    return ANGLE_EQUALS_30;
                else
                    return ANGLE_LESS_THAN_30;
            }
    
        if(angle>=60)
            {
                if(angle==60)
                    return ANGLE_EQUALS_60;
                else
                    return ANGLE_GREATER_THAN_60;
            }
        return ANGLE_BETWEEN_30_AND_60;
    }
    
    public int TestA(双角度)
    {
    如果(角度=60)
    {
    如果(角度==60)
    返回角_等于_60;
    其他的
    返回角大于60;
    }
    _30_和_60之间的返回角_;
    }
    
    但我当然可以

    public int TestB(double angle)
    {
        if(angle<30) return ANGLE_LESS_THAN_30;
        if(angle==30) return ANGLE_EQUALS_30;
        if(angle<60) return ANGLE_BETWEEN_30_AND_60;
        if(angle==60) return ANGLE_EQUALS_60;
        return ANGLE_GREATER_THAN_60;
    }
    
    public int TestB(双角度)
    {
    如果(角度尝试使用“else-if”,以便在满足条件时避免其他检查

    public int TestB(double angle) {
        if(angle<30) return ANGLE_LESS_THAN_30;
        else if(angle==30) return ANGLE_EQUALS_30;
        else if(angle<60) return ANGLE_BETWEEN_30_AND_60;
        else if(angle==60) return ANGLE_EQUALS_60;
        return ANGLE_GREATER_THAN_60;
    }
    
    public int TestB(双角度){
    如果(角度,那么在事物的大格局中,差异是完全可以忽略的

    这不是一个java示例(而是javascript),但您可以看到为什么担心这种微观优化并不能真正帮助解决实际问题


    担心使您的java源代码易于阅读和维护。编译器应该得到比您想象的更多的信任。

    请不要过早进行优化。

    真正的减速是因为糟糕的算法,而不是糟糕的实现。像这样的微优化不应该提前完成。编写可维护的代码,运行软件,只有在遇到真正的性能问题时才进行优化。如果遇到性能问题,请进行分析并检查位置问题就在这里


    对于您关于“的实际问题,首先,您是否意识到
    double
    比较是危险的?请参阅和

    如果
    angle
    参数非常随机,我会使用表查找来避免分支预测失误:

    private static final byte L30 = 0, E30 = 1, L60 = 2, E60 = 3, G60 = 4;
    
    private static final byte[] ANGLE_TABLE = new byte {
        L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30,
        L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30, L30,
        E30, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60,
        L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60, L60,
        E60, G60, G60, ... depends on the angle upper limit
    };
    
    public static int test(double angle) {
        // but not Math.round() or floor(), they are very slow
        int intAngle = (int) (angle + 0.5);
        return ANGLE_TABLE[intAngle];
    }
    

    你的最后一段是非常明智的。如果你从这一认识开始,你就不需要剩下的问题了……哈哈,同意@ruakh……你没有编写任何复杂的算法。因此,无论你使用哪种方法,都没有任何区别。错过分支预测的成本高达100倍。有一个
    r在每一条
    if
    语句中都使用eturn
    ,因此添加
    else
    对性能没有任何影响。“担心让java源代码易于阅读和维护。编译器应该得到比你想象的更多的信任。”说得好。谢谢你的回答。也感谢所有其他答案。我投了反对票,因为1)2)你“实际”答案是错误的,因为OP给出的
    testA
    testB
    中的比较次数是相同的。不,我错了,你的“实际”答案是有道理的。但无论如何,我总是否决“过早优化”优化中的答案questions@leventov不进行过早优化的建议有什么错?大多数时候只是浪费时间考虑它,因为a)编译器无论如何都会对它进行优化(可能是)b)如果它没有自动优化,在99%的情况下它不会产生任何可识别的差异(比如这个例子)。通过优化,您可能会降低代码的可读性和可维护性,如果真的需要,那么在分析之后,您最终仍然可以这样做。@None我无法添加任何内容。假设每个人都已经知道过早优化是万恶之源。请回答这个问题。谢谢。比较双倍优化让我感到非常高兴在我的实际程序中,这部分都是整数数学,但为了提问,我对它进行了极大的简化。我应该在这里的示例中使用(int angle)。听到数学很惊讶。round()和floor()非常慢。我会记住这一点。