【问题标题】:Why does my processing time drop when running the same function over and over again (with incremented values)?为什么一遍又一遍地运行相同的函数(使用递增的值)时我的处理时间会下降?
【发布时间】:2015-08-12 18:05:34
【问题描述】:

我正在测试一种新方法来替换我的旧方法并进行了一些速度测试。 当我现在查看我看到的图表时,每次迭代所需的时间急剧下降。

现在我想知道为什么会这样。 我的问题是,我的显卡接管了繁重的工作,但第一个函数迭代 n 次,第二个(蓝色的)没有单次迭代,但“繁重”的计算使用双精度。

如果需要系统详细信息: 操作系统:Mac OS X 10.10.4 核心:2.8 GHz Intel Core i7 (4x) 显卡:AMD Radeon R9 M370X 2048 MB

如果你需要这两个功能:

新的:

private static int sumOfI(int i) {
    int factor;
    float factor_ = (i + 1) / 2;

    factor = (int) factor_;

    return (i % 2 == 0) ? i * factor + i / 2 : i * factor;
}

老一:

private static int sumOfIOrdinary(int j) {
    int result = 0;
    for (int i = 1; i <= j; i++) {
        result += i;
    }
    return result;
}

为了澄清我的问题: 为什么处理时间会大幅下降?

编辑: 我至少对成本等有一点了解。我可能没有很好地解释我的测试方法。我有一个简单的 for 循环,在这个测试中从 0 计数到 1000,我将每个值提供给 1 个方法并记录它所花费的时间(整个循环执行),然后我对另一种方法做了同样的事情。

所以在循环达到大约 500 次后,相同方法的执行时间明显减少。

【问题讨论】:

  • 澄清一下,迭代是每个函数被调用多少次还是输入到函数中的次数?

标签: java macos


【解决方案1】:

Java 没有计算显卡上的任何东西(没有其他框架或类的帮助)。此外,您认为今天对于 cpu 来说“繁重”的计算有点容易(即使除法有点棘手)。因此速度取决于生成的字节码和运行程序时的 Java 优化,主要取决于 Big-O 表示法。

您的方法 sumOfI 只是要执行的 x 语句,所以这是 O(1),无论您的 i 有多大,它总是只有 x 语句。但是sumOfIOrdinary 使用一个循环,它的 O(n) 这将使用 y 语句 + i 语句,具体取决于输入。

所以从理论上讲,在最坏的种姓中sumOfI 总是比sumOfIOrdinary 快。 你也可以在字节码视图中看到这个问题。 sumOfI 只是对 cpu 的一些 loadaddmultiply 调用。但是对于循环,字节码也使用goto 并且需要返回到旧地址并且需要再次执行行,这将花费时间。

在 i=500000 的 VM 上,第一种方法需要

解释 Big-O-Notation 的链接:

  1. Simple Big O Notation
  2. A beginner's guide to Big O notation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2012-04-06
    • 2015-08-25
    • 1970-01-01
    • 2018-09-19
    • 2012-11-29
    • 2019-09-21
    相关资源
    最近更新 更多