C++ 哪一个执行速度更快? int值=0; foreach(QString字符串、stringlist) 如果(值returnMaximum(Timer.value(string)->确定->经过(), Timer.value(字符串)->Nok->appeased(), Timer.value(字符串)->Err->appeased()) value=this->returnMaximum(Timer.value(string)->Ok->appeased(), Timer.value(字符串)->Nok->appeased(), Timer.value(字符串)->Err->appeased();
或C++ 哪一个执行速度更快? int值=0; foreach(QString字符串、stringlist) 如果(值returnMaximum(Timer.value(string)->确定->经过(), Timer.value(字符串)->Nok->appeased(), Timer.value(字符串)->Err->appeased()) value=this->returnMaximum(Timer.value(string)->Ok->appeased(), Timer.value(字符串)->Nok->appeased(), Timer.value(字符串)->Err->appeased();,c++,performance,qt,C++,Performance,Qt,或 int值=0; foreach(QString字符串、stringlist) { int max=this->returnmax(Timer.value(string)->Ok->appeased(), Timer.value(字符串)->Nok->appeased(), Timer.value(字符串)->Err->appeased()); 如果(值
int值=0;
foreach(QString字符串、stringlist)
{
int max=this->returnmax(Timer.value(string)->Ok->appeased(),
Timer.value(字符串)->Nok->appeased(),
Timer.value(字符串)->Err->appeased());
如果(值<最大值)
值=最大值;
}
及
inline int returnMaximum(int\u a、int\u b、int\u c)
{
int max=_a;
(最大值)&(最大值=);
(max<\u c)和&(max=\u c);
返回最大值;
}
显然,在第二次调用中,您减少了一个函数调用,但我想知道一个函数调用是否会花费我很多,因为坦率地说,我更喜欢第一次调用。第二次调用更便宜。在第一个示例中,此函数中还有一个函数调用+计算。因此,在这种情况下,您所做的工作是所需工作的两倍。如果您非常在意,请进行基准测试并查看
根据经验,如果优化后的结果不一样,您可以预期第二个会表现更好。如果
returnMaximum
函数未内联,这尤其可能会阻止优化程序确定是否确实需要第二个函数调用。如果编译器不成熟,第一个解决方案要求您调用大约7个其他函数(可能会调用函数本身)。除此之外,函数参数中还有6个其他间接项。但实际上,这在很大程度上取决于函数。编译器可能会大大改善您的情况
然而,对于所有这些问题,您应该为您的特定代码进行度量。如果不经常使用此代码段,则不需要对其进行大量优化
除此之外,我会问自己,第一个或第二个代码片段是否更可读。就可读性而言,我会选择第二种解决方案。第一种应该稍微快一点。但区别可能只存在于一个非常基本的编译器上。经过优化后,在现代编译器中,这两种方法最终可能是相同的。要获得准确的结果,请尝试基准测试 第二部分中命名变量的有趣方式。不应该调用
value
吗max
,不应该调用max
吗value
?请记住:调用的函数越多,代码越慢。有一种简单的方法可以找到:测试两个版本并比较性能。您的问题很大程度上取决于returnMaximum
。除此之外,我更喜欢第二个。它不是多余的,并且清楚地描述了它的功能。然而,第一种方法会让你在几秒钟内比较代码。第一种方法是肯定的。如果您再次调用returnMaximum
,您可以更快地执行此操作,这只是为了确定。当您似乎知道if
语句是什么时,为什么(max
呢?我强烈反对。你将如何证明这一点。制作两个示例并运行基准测试。2.在小示例中,函数中的计算仅为1-2行,调用函数的速度约为总速度的20-40%。3.通常在C中有max()函数。在大多数情况下,如果您将此函数重写为内联函数,您将获得速度。所以函数调用是不可避免的。4.有些情况下,编译器可能会将两个调用优化为一个调用,但您必须尝试。它是基于编译器的。问题是标记C++和int value = 0;
foreach (QString string, stringlist)
if(value < this->returnMaximum(Timer.value(string)->Ok->elapsed(),
Timer.value(string)->Nok->elapsed(),
Timer.value(string)->Err->elapsed()))
value = this->returnMaximum(Timer.value(string)->Ok->elapsed(),
Timer.value(string)->Nok->elapsed(),
Timer.value(string)->Err->elapsed());
int value = 0;
foreach (QString string, stringlist)
{
int max = this->returnMaximum(Timer.value(string)->Ok->elapsed(),
Timer.value(string)->Nok->elapsed(),
Timer.value(string)->Err->elapsed()));
if(value < max)
value = max;
}
inline int returnMaximum(int _a, int _b, int _c)
{
int max = _a;
(max < _b) && (max = _b);
(max < _c) && (max = _c);
return max;
}