c++ - 2种循环方式的速度比较

标签 c++ loops

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

forfind 始终比 whilefind 表现更好。起初我只是通过将 10000 个整数推回一个 vector 进行测试,然后使用 find 从中获取单个值并将其返回给迭代器。我计时并输出那个时间。

然后我决定更改它,以便多次使用 forfind 和 whilefind 函数(在本例中为 10000 次)。但是,for 循环查找仍然比 while 查找具有更好的性能。谁能解释一下?这是代码。

#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 秒。

最佳答案

if(*p = val) return p;

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

关于c++ - 2种循环方式的速度比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1343046/

相关文章:

php - 在文件中间覆盖

c++ - 在特定位置将 char 附加到 std::vector<string>

c++ - 使用 lambda 填充 vector 以确定索引是偶数还是奇数

java - 如何退出这个循环呢?

Javascript/JQuery 遍历数组值

loops - Verilog 向量内积

c++ - 如何在 C++ 中拥有私有(private)成员变量和对它们的引用

c++ - VirtualAlloc C++,注入(inject)的dll,asm

java - (Java) 在另一个数组中搜索一个数组的值的索引

ruby-on-rails - 哈希数组插入另一个数组