Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.90
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
#1

std::vector доступ по индексу vs доступ по итератору - C++

15.04.2013, 13:30. Просмотров 4198. Ответов 24
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    std::vector<int> tmp;
    int i = 0;
    tmp.resize(1000000);
    std::vector<int>::iterator it = tmp.begin();
    for (int m = 0; m < 10000; ++m)
    {
        for(; it != tmp.end(); ++it)
        {
            (*it) = i + 1;
            ++i;
        }
        it = tmp.begin();
        for(; it != tmp.end(); ++it)
            i = (*it);
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    std::vector<int> tmp;
    int j = 0;
    tmp.resize(1000000);
    for (int m = 0; m < 10000; ++m)
    {
        size_t i = 0;
        for (; i < 1000000; ++i)
        {
            tmp[i] = j + 1;
            ++j;
        }
        i = 0;
        for (; i < 1000000; ++i)
            j = tmp[i];
    }
В дебаге доступ по индексу работает в 2-2.5 раза быстрее, нежели итераторы,
в релизе картина с точностью до наоборот - итераторы в 2 раза быстрее.
Как сие можно объяснить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 13:30     std::vector доступ по индексу vs доступ по итератору
Посмотрите здесь:
C++ Как в std::vector получить доступ к методам элементов?
C++ Доступ по итератору к элементу вектора
C++ Builder Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>...
Доступ к индексу пиктограммы C++ Builder
Нужно дореализовать доступ по индексу в матрице C++
C++ Доступ по индексу после передачи дека в функцию
Вывести значения std::vector<std::vector<int*> > C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.04.2013, 15:16     std::vector доступ по индексу vs доступ по итератору #2
Цитата Сообщение от oxotnik Посмотреть сообщение
for(; it != tmp.end(); ++it)
не эффективный цикл, на каждой итерации идет обращение к tmp.end().

Добавлено через 2 минуты
Заменить на
C++
1
for(auto stop = tmp.end(); it != stop; ++it)
и попробовать снова.
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 715
15.04.2013, 15:20     std::vector доступ по индексу vs доступ по итератору #3
и во втором цикле можно взять const_iterator, в теории обещают преимущества
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
15.04.2013, 15:34  [ТС]     std::vector доступ по индексу vs доступ по итератору #4
Цитата Сообщение от yuron_477 Посмотреть сообщение
не эффективный цикл, на каждой итерации идет обращение к tmp.end().
Цитата Сообщение от abit Посмотреть сообщение
и во втором цикле можно взять const_iterator, в теории обещают преимущества
В рамках указанного количества итераций - монопенисуально, т.е. в пределах погрешности.
PS: а вопрос все же открыт.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
15.04.2013, 16:35     std::vector доступ по индексу vs доступ по итератору #5
oxotnik,
В дебаге доступ по индексу работает в 2-2.5 раза быстрее, нежели итераторы,
MSVC небось? http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
15.04.2013, 16:39  [ТС]     std::vector доступ по индексу vs доступ по итератору #6
Цитата Сообщение от ForEveR Посмотреть сообщение
MSVC небось?
gcc под линуксом...
а MSVC вообще говнокомпилятор, я с ним не работаю, после того, как ловил 2 дня баг в его реализации stringstream
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
15.04.2013, 18:15     std::vector доступ по индексу vs доступ по итератору #7
oxotnik, Ну ок... Вообще в debug версии вполне возможны некие проверки и для gcc. Собрано с флажком -D_GLIBCXX_DEBUG? А вообще в чем вопрос? Вполне резонно, что в debug версии итераторы будут более тормозные.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
15.04.2013, 18:45     std::vector доступ по индексу vs доступ по итератору #8
Про дебаг написали выше, а про релиз
в релизе картина с точностью до наоборот - итераторы в 2 раза быстрее.
нужно конечно ассембреный код глянуть, но можно предположить, что итератор в релизе реализован как простой указатель и прямой доступ по указателю быстрее, чем через вызов оператора [].
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
15.04.2013, 22:08  [ТС]     std::vector доступ по индексу vs доступ по итератору #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Вполне резонно, что в debug версии итераторы будут более тормозные.
Меня и интересует почему...
Цитата Сообщение от Kastaneda Посмотреть сообщение
что итератор в релизе реализован как простой указатель и прямой доступ по указателю быстрее
В принципе он и в дебаге так же реализован.
Цитата Сообщение от Kastaneda Посмотреть сообщение
чем через вызов оператора [].
Только непонятно в чем между ними различие.
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.04.2013, 22:48     std::vector доступ по индексу vs доступ по итератору #10
Зависит от компилятора и ключей оптимизации. На ассемблерном-то уровне понятно, что обход через указатели быстрее обхода через индексы, но нормальный компилятор в таких вещах разбирается лучше.
И даже если ваш компилятор ничего не оптимизировал, я никогда не поверю в то, что способ получения адреса элемента ускорит обход в 2 раза - доступ к памяти никуда не делся, а ведь он пожирает ~200 процессорных тактов. Мелкая арифметика на фоне этой операции вообще ни на что не влияет.

Обновил страничку :)

Цитата Сообщение от Kastaneda Посмотреть сообщение
вызов оператора []
Да, слона то я и не приметил. Если не использовать магические ключики оптимизаций, то [] не заинлайнится. Хотя, такое таки маловероятно - сложно представить себе человека, который задумывается о перформансе и при этом не включил хотя бы -O1.

Цитата Сообщение от oxotnik Посмотреть сообщение
gcc под линуксом...
Тогда, если оптимизация таки использовалась, дело в том, что компилятор предпринял разные оптимизации для этих циклов.

Добавлено через 2 минуты
Кстати, мне лень вникать в логику второго кода, но на лвс он работает более 10 секунд. Таки есть подозрение, что циклы немного неэквивалентны.
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
15.04.2013, 23:08  [ТС]     std::vector доступ по индексу vs доступ по итератору #11
Цитата Сообщение от diagon Посмотреть сообщение
Кстати, мне лень вникать в логику второго кода, но на лвс он работает более 10 секунд. Таки есть подозрение, что циклы немного неэквивалентны.
Медленный ~20-24 с, быстрый ~10-12c. (на виртуалке).
Почему они не эквивалентны? По логике они абсолютно эквивалентны, а логика в данном случае - определяющий фактор.
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.04.2013, 23:21     std::vector доступ по индексу vs доступ по итератору #12
Цитата Сообщение от oxotnik Посмотреть сообщение
Почему они не эквивалентны? По логике они абсолютно эквивалентны, а логика в данном случае - определяющий фактор.
Потому что первый на гцц с оптимизациями выполняется за 0.1 секунду, второй - более 10 секунд.
Хотя, во втором цикле действительно не так то просто отследить, что не будет выхода за границы или чего-то подобного.
Посмотрел на асмовыхлоп гцц на первом цикле - лол, да и только.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
15.04.2013, 23:34     std::vector доступ по индексу vs доступ по итератору #13
Внутри цикла по m во втором коде я вижу обнуление индекса в строках 6 и 12, а в первом коде итератор обнуляется только в строке 12 (ну и один раз до цикла). А второй раз что? Не нужно? Или это я настолько "с наскока", что ничего не понял?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
16.04.2013, 07:46     std::vector доступ по индексу vs доступ по итератору #14
grizlik78, А ведь действительно. Получается этот цикл:

C++
1
2
3
4
5
        for(; it != tmp.end(); ++it)
        {
            (*it) = i + 1;
            ++i;
        }
Выполнится единожды.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 09:11     std::vector доступ по индексу vs доступ по итератору
Еще ссылки по теме:
Как изменять размер std::vector<std::vector>? C++
Класс: Двухмерный массив ([]-доступ по индексу,+-сложение матриц,--транспонирование матрицы) C++
Как сделать массив, доступ к элементам, в котором, возможен и по индексу и по строковому ключу? Visual C++
Доступ к элементам в std::map C++
Доступ к vector<pair<.>> как к памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
16.04.2013, 09:11  [ТС]     std::vector доступ по индексу vs доступ по итератору #15
Цитата Сообщение от grizlik78 Посмотреть сообщение
Внутри цикла по m во втором коде я вижу обнуление индекса в строках 6 и 12, а в первом коде итератор обнуляется только в строке 12 (ну и один раз до цикла). А второй раз что? Не нужно? Или это я настолько "с наскока", что ничего не понял?
Твоя правда. Если обнулять в обоих случаях, тогда одинаково примерно работают.
Можно закрывать тему.
Yandex
Объявления
16.04.2013, 09:11     std::vector доступ по индексу vs доступ по итератору
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru