【问题标题】:Optimization of java code for reducing complexity [closed]优化java代码以降低复杂性[关闭]
【发布时间】:2017-06-19 20:14:53
【问题描述】:

我实际上是 Java 库的新手。我不知道这段代码在做什么。 我被赋予了优化这一点的任务。任何帮助都会很有用。

我的意思是问str.equals(local) 是否在for 循环中检查整个字符串 aur 的特定索引值。

public void fnc(String str, int[] ar1)
    {
        String local = "findnumber";
        for(int i=0; i<ar1.length; i++)
        {
            if(str.equals(local) && ar1[i] * 2 > 10) 
            {
                Integer ip = new Integer(ar1[i]);
                ip = ip * 2;
                System.out.print(ip.toString());
            }
        }
    }

【问题讨论】:

  • 请展示您的尝试。这里有很多容易改进的地方,但仅仅告诉你答案对你来说几乎没有学习优势。
  • 复杂性是什么意思?算法的计算复杂度?人类阅读/理解代码的复杂性?
  • if(str.equals("findnumber")) for(int i: ar1) { i*=2; if(i&gt;10) System.out.print(i); }
  • 没有必要做两次乘法。由于比较需要其结果,因此您必须在比较之前执行此操作。您只能在对象上调用toString()(例如Integer 实例),但这里已经过时了,因为print(int) 已经执行了预期的操作。
  • 就像我问你“猫是什么意思?猫科动物还是土方设备?” ...而你回答“我的意思是整只猫”。

标签: java optimization java-8 libraries


【解决方案1】:

算法的大 O 复杂度是O(N),其中N 是数组大小。您无法改进...对于提供的参数并产生相同的输出。

不过,可以采取一些措施来提高效率。

  • 提示:查找在每个循环迭代上执行一次的计算。
  • 提示:寻找一些不必要的对象创建1
  • 提示:不必要的使用引用类型。

还有一两个其他有问题的微优化,但看看你是否可以在没有任何提示的情况下发现它们。 (我说“有问题”是因为我怀疑 JIT 编译器自己也会做同样的优化。)

最后一点:代码的实际速度将取决于print 语句,以及操作系统向(例如)控制台写入内容的能力。并且可能受到 JVM 启动/预热效果...除非fnc 方法被多次调用。


1 - 尽管如此,new Integer(...) 是将int 转换为Integer 的错误方法。

【讨论】:

  • 你可以用这个简单的循环做的所有事情都属于“JIT 可以做到”的微优化类别。只要他们还消除了不必要的重复或过时的处理步骤,换句话说,也消除了源代码中的视觉混乱,那就没有错。只有当代码可读性受到影响或花费太多开发时间时,微优化才不好......
  • @Sandeep - 不。它正在将int 转换为Integer,但是您需要转换为Integer 吗?
  • @Stephen C:如果 Escape Analysis 可以证明其纯粹的本地性质,它确实如此,这里就是这种情况。当然,使用Integer.valueOf(或只是自动装箱)来明确表示对象身份的不相关性仍然更好。但是,正如您已经说过的,打印操作将主导速度,因此 JIT 可能不会查看此循环......
  • @Sandeep - 这不相关。你可以从方法签名中看出arr是什么类型!
猜你喜欢
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
相关资源
最近更新 更多