- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 if 条件。第一次条件为假时,循环可以终止。
因此,对于 for 循环,如果条件为假,它会继续迭代并进行简单的变量更改。使用条件作为 while 参数的 while 循环,一旦条件为假,循环将停止并且应该节省一些迭代。
但是,while 循环仍然比 for 循环慢一点!
但是,如果我将一个 int 值作为计数器并计算迭代次数,For 循环将按预期执行更多次迭代。然而这次,带有计数器的修改后的 For 方法的执行时间将比带有计数器的 while 方法慢得多!
有什么解释吗?
这里是带有for循环的代码:
for (int i = pairs.length - 1; i >= 0; i -= 2) {
//cpt++;
u = pairs[i];
v = pairs[i - 1];
duv = bfsResult.distanceMatrix.getDistance(u, v);
if (duv > delta) {
execute();
}
}
执行时间:6473
使用计数器执行时间:8299
迭代计数:2584401
这里是 while 循环的代码:
int i = pairs.length - 1;
u = pairs[i];
v = pairs[i - 1];
duv = bfsResult.distanceMatrix.getDistance(u, v);
while (duv > delta) {
//cpt++;
execute();
u = pairs[i -= 2];
v = pairs[i - 1];
duv = bfsResult.distanceMatrix.getDistance(u, v);
}
执行时间:6632
使用计数器执行时间:7163
迭代次数:9793
时间以毫秒为单位,我用不同大小的实例重复了几次实验,措施几乎保持不变。 execute() 方法更新增量值。方法 getDistance() 只是一个矩阵 int[][] 访问。
感谢您的帮助。
最佳答案
在您尝试对 Java 执行任何性能测试之前,我强烈建议您阅读这篇文章 http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html
简而言之 - 运行一段时间后,启用 Hotspot 的 JVM 可以优化您的代码,这将影响测试结果。因此,您需要适当的技术来测试代码的性能。为了减轻痛苦,有一个用于执行适当测试的库:http://ellipticgroup.com/html/benchmarkingArticle.html您可以在此页面上找到文章两部分的链接。
更新:为了帮助您更快地开始,这里是您需要做的:
System.out.println(new Benchmark(new WhileApproach()));
显示 while 循环的执行时间,显然
System.out.println(new Benchmark(new ForApproach()));
获取for循环的信息
关于Java For 循环 vs While 循环,奇怪的行为和时间性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8183143/
我是一名优秀的程序员,十分优秀!