【问题标题】:Speed comparison of 2 loop styles两种循环样式的速度比较
【发布时间】:2009-08-27 18:42:32
【问题描述】:

我正在阅读有关 STL 算法的书,书中指出像 find 这样的算法使用 while 循环而不是 for 循环,因为它是最小的、高效的,并且使用的变量更少。我决定做一些测试,结果并没有真正匹配。

forfind 的性能始终优于 whilefind。起初我只是通过将 10000 个整数推回向量中进行测试,然后使用 find 从中获取单个值并将其返回给迭代器。我计时并输出那个时间。

然后我决定对其进行更改,以便多次使用 forfind 和 whilefind 函数(在本例中为 10000 次)。但是,for 循环 find 仍然比 while find 提供了更好的性能。谁能解释一下?这是代码。

#include "std_lib_facilities.h"
#include<ctime>

template<class ln, class T>
ln whilefind(ln first, ln last, const T& val)
{
    while (first!=last && *first!=val) ++first;
    return first;
}

template<class ln, class T>
ln forfind(ln first, ln last, const T& val)
{
    for (ln p = first; p!=last; ++p)
        if(*p == val) return p;
    return last;
}

int main()
{
    vector<int> numbers;
    vector<int>::iterator whiletest;
    vector<int>::iterator fortest;
    for (int n = 0; n < 10000; ++n)
        numbers.push_back(n);

    clock_t while1 = clock();   // start
    for (int i = 0; i < 10000; ++i)
        whiletest = whilefind(numbers.begin(), numbers.end(), i);
    clock_t while2 = clock();   // stop

    clock_t for1 = clock(); // start
    for (int i = 0; i < 10000; ++i)
        fortest = forfind(numbers.begin(), numbers.end(), i);
    clock_t for2 = clock(); // stop

    cout << "While loop: " << double(while2-while1)/CLOCKS_PER_SEC << " seconds.\n";
    cout << "For loop: " << double(for2-for1)/CLOCKS_PER_SEC << " seconds.\n";
}

while 循环始终报告花费了大约 0.78 秒,而 for 循环报告了 0.67 秒。

【问题讨论】:

  • 尝试颠倒顺序 - 先对 for 循环计时,然后再对 while 循环计时?
  • 这是一个很好的建议。如果第一次测试将必要的数据提取到缓存中,那么第二次访问该数据时,您将看到性能有很大的提高。另一种消除这种影响的方法是将测试编码为两个独立的过程。
  • 您是否在进行优化编译?如果您在 Visual Studio 中执行此操作,您是否在关闭 Microsoft 最新的迭代器检查的情况下进行编译?
  • forfind 好像有错误。 '如果(*p = val) 返回 p;'应该是 ==
  • Bug 已修复,但时间仍然更短。

标签: c++ loops


【解决方案1】:
if(*p = val) return p;

那应该是==。所以 forfind 只会遍历整个向量的第一个值 0,并立即返回数字 1-9999。

【讨论】:

  • 你明白了!但是 for 循环仍然输出较短的时间。
  • 啊,你更快,收集代表:)
  • @trikker:打开编译器优化。例如,在 gcc v4.3.2 中,-O2 级别产生而/对于 .04/.06,-O0 级别产生 .72/.66。它不仅开始工作的速度提高了 10 倍(而且您在使用 C++ 的任何地方都使用 -O2),而且 while 的性能也轻松优于 for 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
相关资源
最近更新 更多