2种循环风格的速度比较

tri*_*ker 3 c++ loops

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

forfind始终比whilefind更好地表现.首先,我简单地通过将10000 ints推回到向量中进行测试,然后使用find从中获取单个值并将其返回到迭代器.我把它计时并输出那个时间.

然后我决定改变它,以便多次使用forfind和whilefind函数(在这种情况下10000次).然而,for循环查找仍然提供了比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";
}
Run Code Online (Sandbox Code Playgroud)

while循环始终报告大约0.78秒,for循环报告.67秒.

Rüd*_*nke 11

if(*p = val) return p;
Run Code Online (Sandbox Code Playgroud)

那应该是一个==.因此forfind只会通过第一个值0的整个向量,并立即返回数字1-9999.

  • @trikker:打开编译器优化.例如,在gcc v4.3.2中,-O2级别产生/而.04/.06,-O0级别产生.72/.66.它不仅开始工作速度提高了10倍(而且你在使用C++的地方使用-O2),但_while_ easilly优于_for_循环. (3认同)