[英]Why does my processing time drop when running the same function over and over again (with incremented values)?
我正在测试一种新方法来替代旧方法,并进行了一些速度测试。 现在,当我查看图表时,每次迭代所花费的时间将大大减少。
现在我想知道为什么会这样。 我的问题是,我的图形卡承担了繁重的工作,但是第一个函数迭代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;
}
为了澄清我的问题:为什么处理时间会急剧减少?
编辑:我至少了解一点有关成本等。 我可能对测试方法的解释不够好。 我有一个简单的for循环,在此测试中,该循环从0到1000计数,并将每个值馈给1方法并记录了花费的时间(整个循环执行),然后对其他方法进行了同样的处理。
因此,在循环达到约500个之后,相同的方法花费的时间明显减少。
Java没有在图形卡上计算任何内容(没有其他框架或类的帮助)。 另外,对于今天的CPU,您认为“繁重”的计算也很容易(即使除法有些棘手)。 因此,速度取决于运行程序时生成的字节码和Java优化,并且主要取决于Big-O表示法。
您的方法sumOfI
只是要执行的x条语句,所以它是O(1),无论您的i多么大,它始终仅此x条语句。 但是sumOfIOrdinary
使用一个循环,其O(n)将根据输入使用y语句+ i语句。
因此,从理论上讲,在最坏的情况下, sumOfI
总是比sumOfIOrdinary
更快。 您也可以在字节码视图中看到此问题。 sumOfI
只是一些load
和对cpu的add
和multiply
调用。 但是对于循环来说,字节码也使用goto
并且需要返回到较旧的地址,并且需要再次执行行,这将花费时间。
在我的i = 500000的VM上,第一种方法需要<1毫秒,而第二种方法由于循环需要2-4毫秒。
解释大O符号的链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.