-2
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;
}

显然,在第二个中,您减少了一个函数调用,但我想知道一个函数调用是否会花费我很多,因为坦率地说,我更喜欢第一个。

4

4 回答 4

3

如果编译器很幼稚,第一个解决方案需要您调用大约 7 个其他函数(它们可能会调用函数本身)。除此之外,函数参数中还有 6 个其他间接方式。但实际上,这在很大程度上取决于功能。编译器可能会大大改善您的情况。

但是,对于所有 is-this-faster-than-that 问题,您应该对您的特定代码进行测量。如果您不经常使用此代码段,则不需要对其进行大量优化。

除此之外,我会问自己第一个或第二个代码片段是否更具可读性。在可读性方面,我会选择第二种解决方案。

于 2013-05-29T06:39:09.707 回答
0

第二个电话更便宜。在第一个示例中,您在此函数中还有一个函数调用 + 计算。所以在这种情况下,你需要做两倍的工作。

于 2013-05-29T06:33:47.453 回答
0

第一个应该稍微快一点。但差异可能只存在于一个非常基本的编译器上。优化后两者在现代编译器中实际上可能最终相同。要获得准确的结果,请尝试基准标记。

于 2013-05-29T06:46:48.947 回答
0

如果您非常关心,请进行基准测试并查看。

根据经验,如果优化后它们的结果不同,您可以预期第二个性能会更好。如果returnMaximum函数没有内联,这尤其可能会阻止优化器确定是否真的需要第二个函数调用。

于 2013-05-29T06:35:53.963 回答