【问题标题】:(Dis)Proving that one algorithm works faster than another due to language internals(Dis)证明一种算法由于语言内部而比另一种算法运行得更快
【发布时间】:2011-05-28 00:39:51
【问题描述】:

对于大学的一个项目,当给定一组元素和所述元素之间的关系集合时,我们必须实现一些不同的算法来计算等价类。

我们被指示实施Union-Find 算法及其优化(Union by Depth、Size)等。偶然(做一些我认为对算法的正确性是必要的)我发现了另一种优化算法的方法。

它没有Union By Depth 快,但很接近。我这辈子都想不通为什么它会这么快,所以我咨询了一位也想不通的助教。

该项目是在 java 中,我使用的数据结构是基于简单的整数数组(对象,而不是 int) 后来,在项目的评估中,我被告知它可能与“Java 缓存”有关,但我在网上找不到任何关于缓存如何影响这一点的信息。

在不计算算法复杂度的情况下,证明或反驳我的优化之所以这么快是因为 java 的做事方式,最好的方法是什么?用另一种(较低级别?)语言实现它?但是谁能说语言不会做同样的事情呢?

我希望我说清楚了,

谢谢

【问题讨论】:

    标签: java algorithm optimization complexity-theory time-complexity


    【解决方案1】:

    对于现代虚拟机来说,执行这样的任务通常是非常困难的!就像你暗示他们在你背后做各种各样的事情。方法调用被内联,对象被重用。等等。一个典型的例子是,如果它们显然没有执行除计数之外的任何操作,那么它们是如何被编译掉的。或者函数式编程中的函数调用是如何内联或优化尾调用的。

    此外,您很难在任何数据集上证明您的观点。 O(n^2) 可以很容易地比看似更快的算法快得多,比如 O(n),算法。两个例子

    1. 在对接近排序的数据集合进行排序时,冒泡排序比快速排序更快。
    2. 一般情况下的快速排序,当然更快。

    通常,大 O 表示法会故意忽略在实际情况下可能对您的实现意味着生死攸关的常量。这些常数可能是打击你的原因。所以在实践中 0.00001 * n ^2(比如你的算法的运行时间)比 1000000 * n log n 快

    因此,鉴于您提供的信息有限,推理很难。

    【讨论】:

      【解决方案2】:

      唯一的方法是证明算法的最坏情况(平均情况等)复杂度。

      因为如果你不这样做,它可能只是结合的结果

      • 具体数据
      • 数据的大小
      • 硬件的某些方面
      • 语言实现的某些方面

      【讨论】:

        【解决方案3】:

        很可能编译器或 JVM 为您的代码找到了优化。您可以尝试读取javac 编译器输出的字节码,并使用-Djava.compiler=NONE 选项禁用运行时JIT 编译。

        【讨论】:

          【解决方案4】:

          如果您可以访问源代码——我相信 JDK 源代码是可用的——那么你可以通过它来查找相关的实现细节。

          【讨论】:

          • 对我来说听起来像是一个为期一年的研究项目,甚至开始了解 JIT 和 GC 以及计算机硬件架构......
          猜你喜欢
          • 2011-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-03
          • 2021-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多