【发布时间】:2019-07-06 12:18:45
【问题描述】:
我想知道哪种代码效率更高,我有两种选择。你会说哪个更有效,为什么?谢谢。
选项 A
array1 size is 1000
array2 size is 2000
for(int i = 0; i < array1.size(); i++)
{
for(int j = 0; j < array2.size(); j++) {
if(array1[i].method() == array2[j].method()) // CHECKS IF THERE'S AN EQUAL IN BOTH ARRAYS
{
doSomething();
break;
}
if(j == array2.size()-1) // CHECKS IF ARRAY1 DID NOT FIND A MATCH
{
doSomething();
break;
}
for(k = 0; k < array1.size(); k++)
{
if(array1[k].method() == array2[j].method()) // CHECKS IF THERE'S AN EQUAL IN BOTH ARRAYS
{
// BUT DOES NOTHING BECAUSE IT WAS DONE ALREADY UPSIDE
break;
}
if(k == array1.size()-1) // CHECKS IF ARRAY2 DID NOT FIND A MATCH
{
doSomething();
break;
}
}
}
}
选项 B
array1 size is 1000
array2 size is 2000
for(int i = 0; i < array1.size(); i++)
{
for(int j = 0; j < array2.size(); j++) {
if(array1[i].method() == array2[j].method()) // CHECKS IF THERE'S AN EQUAL IN BOTH ARRAYS
{
doSomething();
break;
}
if(j == array2.size-1) // CHECKS IF ARRAY1 HAS NO ARRAY2 MATCH
{
doSomething();
break;
}
}
}
for(int j = 0; j < array2.size(); j++)
{
for(int i = 0; i < array1.size(); i++) {
if(array2[j].method() == array1[i].method()) // CHECKS IF THERE'S AN EQUAL IN BOTH ARRAYS
{
// BUT DOES NOTHING BECAUSE IT WAS DONE ALREADY UPSIDE
break;
}
if(i == array1.size-1) // CHECKS IF ARRAY2 HAS NO ARRAY1 MATCH
{
doSomething();
break;
}
}
}
我目前已经实现了选项 B,我想知道是否应该转到选项 A,因为尽管选项 A 可能需要更多时间,但我不知道是两个循环都需要更多时间还是一个循环完成所有迭代需要更多时间. 或者可能是一样的,我真的不知道。
【问题讨论】:
-
我认为你从测量开始。不要猜测,学习如何正确测量您的代码!
-
“如果你有两匹马,并且你想知道这两匹马中哪一个跑得更快,那就让你的马赛跑吧。” - 埃里克·利珀特,ericlippert.com/2012/12/17/performance-rant
-
我将 array1[i].method() 移到内部循环之外,因为它的值不应该随着 j 的变化而变化,
-
if(array1[i].method() == array2[j].method()) 不能从循环中取出,除非 for(condition) Type of var var1 = array1[i] .method() 和 var var2 的类型 = array2[j].method()。这对优化有帮助还是对 if 内部循环比较无动于衷? @NormR
-
扩展@GhostCat的评论:如果你测量性能,请使用JMH保证代码是热的。