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++和 STD::max 是模板,所以它是隐式内联的。2) 没有更多的信息,这完全是错误的。如果可能的话,至少有一个像样的编译器,调用将内联,甚至跨翻译单元。即使它不是内联的,“总体速度”意味着总速度,你也不知道程序有多大,调用函数的频率有多高。另外,两行代码是相对的-您可以在两行代码中完成很多工作。至于1),在你做出这些基准之前,这是一个没有争议的问题。所以第一个示例是:1。如果依赖编译器2,则与第一个相同。若编译器并没有对其进行优化,则速度将低于秒。无法理解为什么要冒险使用第一个样本。P.S.“总速度”指总功能执行时间。对于1-2行,我的意思是类似max()函数的东西。此外,我还使用max()函数进行了基准测试,我确信我所说的是正确的。制作这样一个基准测试的代码大约有10-15行。所以很容易在一分钟内被每个人检查。我从来没有说过。我只是说,没有任何支持,你的声明太有力了。“第二个电话更便宜。”-不,可能更便宜。
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;
}