Java 为什么在一次又一次地运行同一个函数(使用递增的值)时,我的处理时间会减少?

Java 为什么在一次又一次地运行同一个函数(使用递增的值)时,我的处理时间会减少?,java,macos,Java,Macos,我正在测试一种新方法来取代我的旧方法,并做了一些速度测试。 当我现在查看图表时,我发现每次迭代所需的时间急剧下降 现在我想知道为什么会这样。 我的问题是,我的图形卡承担了繁重的工作,但是第一个函数迭代n次,第二个(蓝色的)没有一次迭代,而是使用双倍的“繁重”计算工作 如果需要系统详细信息: 操作系统:Mac OS X 10.10.4 核心:2.8 GHz英特尔核心i7(4x) GPU:AMD Radeon R9 M370X 2048 MB 如果您需要这两个功能: 新的: private stat

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

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

如果需要系统详细信息: 操作系统:Mac OS X 10.10.4 核心:2.8 GHz英特尔核心i7(4x) GPU: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;
}
私有静态int(int j){
int结果=0;

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

你的方法
sumOfI
只是执行x个语句,所以这是O(1),不管i有多大,它总是只执行x个语句。但是
sumOfI
使用一个循环,它的O(n)将根据输入使用y个语句+i个语句

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


在i=500000的VM上,第一个方法需要澄清,迭代次数是每个函数被调用的次数还是输入到函数中的次数?