Сравнение скорости двух стилей петли - PullRequest
3 голосов
/ 27 августа 2009

Я читаю об алгоритмах STL, и книга указала, что алгоритмы типа find используют цикл while, а не цикл for, потому что он минимален, эффективен и использует на одну переменную меньше. Я решил провести некоторое тестирование, и результаты на самом деле не совпали.

forfind стабильно работал лучше, чем whilefind. Сначала я просто протестировал, вставив обратно 10000 целых в вектор, а затем использовал find, чтобы получить из него одно значение и вернуть его итератору. Я рассчитал это и вывел это время.

Затем я решил изменить его так, чтобы функции forfind и whilefind использовались несколько раз (в данном случае 10000 раз). Тем не менее, поиск for по-прежнему имеет лучшую производительность, чем 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 секунды.

1 Ответ

11 голосов
/ 27 августа 2009
if(*p = val) return p;

Это должно быть ==. Таким образом, forfind будет проходить весь вектор только для первого значения 0 и немедленно возвращаться для чисел 1-9999.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...