Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两种环路样式的速度比较_C++_Loops - Fatal编程技术网

C++ 两种环路样式的速度比较

C++ 两种环路样式的速度比较,c++,loops,C++,Loops,我正在阅读STL算法,书中指出,像find这样的算法使用while循环而不是for循环,因为它是最小的、高效的,并且使用的变量更少。我决定做一些测试,结果并不完全相符 forfind始终比whilefind表现更好。起初,我只是简单地将10000个整数推回一个向量,然后使用find从中获取一个值并将其返回到迭代器。我给它计时并输出时间 然后我决定更改它,以便forfind和whilefind函数被多次使用(在本例中为10000次)。但是,for循环查找仍然比while查找具有更好的性能。有人能解

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

forfind始终比whilefind表现更好。起初,我只是简单地将10000个整数推回一个向量,然后使用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";
}
#包括“std_lib_facilities.h”
#包括
模板
在发现时(第一个、最后一个、常数T&val)
{
而(first!=last&&*first!=val)++first;
先返回;
}
模板
ln forfind(ln first,ln last,常量T&val)
{
对于(LnP=第一个;p!=最后一个;++p)
if(*p==val)返回p;
最后返回;
}
int main()
{
向量数;
向量::迭代器whiletest;
向量::迭代器fortest;
对于(int n=0;n<10000;++n)
数字。推回(n);
clock_t while1=clock();//开始
对于(int i=0;i<10000;++i)
whiletest=whilefind(numbers.begin(),numbers.end(),i);
clock_t while2=clock();//停止
clock_t for 1=clock();//开始
对于(int i=0;i<10000;++i)
fortest=forfind(numbers.begin(),numbers.end(),i);
时钟为2=时钟();//停止
库特

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

尝试反转顺序-先对for循环计时,然后对while循环计时?这是一个很好的建议。如果第一次测试将必要的数据拉入缓存,您将看到一个很大的改进在您第二次访问该数据时,nt会降低性能。另一种消除这种影响的方法是将测试编码为两个单独的进程。您是否使用优化进行编译?如果您在Visual Studio中执行此操作,是否在编译时关闭了microsoft最新的迭代器检查功能?forfind中似乎有错误。如果(*p=val)return p;'should be==错误已修复,但时间更短。知道了!但是for循环输出的时间更短。啊,你更快了,收集rep:)@trikker:打开编译器优化。例如,在gcc v4.3.2中,-O2级别产生的结果是/For.04/.06,-O0级别产生的结果是.72/.66。它不仅开始工作速度快了10倍(而且在使用C++的任何地方都要使用-O2),而且很容易比For循环的性能好。
if(*p = val) return p;