【问题标题】:Double simpler for loop vs one complex双重简单的 for 循环与一个复杂的循环
【发布时间】:2017-12-24 23:15:57
【问题描述】:

也许这是一个愚蠢的问题,但假设我有两个函数,void F1(int x) 和 void F2(int x),我想在 for 循环的每次迭代中执行它们。如果我做一个大的 for 循环,它会有多大差异(性能方面),如下所示:

`
for(int i = 0; i < 100 ; i++)
{
    F1(i);
    F2(i);
}
`

相比做两个单独的循环,一个我叫F1,一个我叫F2:

`
for(int i = 0 ; i < 100 ; i++)
    F1(i);
for(int i = 0 ; i < 100 ; i++)
    F2(i);
`

在写这篇文章时,我突然想到第一种方法可能更快,因为只有大约 100 个增量和 100 个比较,而在第二种情况下,我们将得到 200 个。

假设我的循环只需运行 200 次迭代。考虑到 2007 年及之后的 CPU,两个 for 循环方法在性能方面是否几乎相同:)?

【问题讨论】:

  • 最简单的事情:编写一个测试来测量两种情况所花费的时间
  • 如果有任何性能差异,很可能是由缓存局部性决定的。答案可能完全取决于实际用例。唯一的解决方案是在您的实际应用和测量中都进行尝试。
  • 请记住,这两个示例的行为不同。第一个将交织对F1F2 的调用,而第二个将执行对F1 的所有调用,然后是对F2 的所有调用。使用正确且更易于阅读和理解的内容。只有当您稍后测量该代码中的瓶颈时,您才应该担心性能。
  • @FrançoisAndrieux 此外,由于这很可能是缓存问题,因此此代码的性能特征可能因 CPU 类型而异。 i5 可能会以与生产中使用的 Xeon 完全不同的方式来处理这个问题。这里没有简单的正确答案,因为正如您所建议的,答案以“取决于...”开始

标签: c++ performance for-loop optimization


【解决方案1】:

好吧,正如您所指出的,操作的数量不同。 但是,如果您使用第二种解决方案,您可以使用多个线程并获得相同或更好的性能。此外,考虑可读性、可测试性、可扩展性、封装性,通常这些因素比您可能获得的任何小的性能提升更重要。而且,编译器通常非常擅长让您的代码更有效地运行,所以我的建议是在大多数情况下更关注您的可读性而不是性能。

【讨论】:

    【解决方案2】:

    这取决于F1F2 做什么。

    这根本不重要,否则您可能会通过一个接一个地调用这两个函数来体验显着的减速。

    作为后一种情况的一个例子,考虑F1F2 访问两个不同的数组。在F1F2 的每次运行中,它们读取的数据足以导致整个缓存被覆盖。这可能会导致减速。

    但最好不要推测、测量和基准测试您的代码。如果两个版本的性能相同,请选择可读性最高的版本。

    【讨论】:

    • 反之亦然:如果F1F2 访问给定i 的相似数据,第一种情况可能会更快。
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 2018-04-11
    • 2022-08-12
    • 1970-01-01
    • 2021-08-27
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多