Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/64: Рейтинг темы: голосов - 64, средняя оценка - 4.56
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1

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

15.04.2013, 13:30. Показов 13808. Ответов 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 раза быстрее.
Как сие можно объяснить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2013, 13:30
Ответы с готовыми решениями:

Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>...
Есть двухмерный вектор: std::vector&lt;std::vector&lt;TRabbitCell&gt; &gt; *cells(5, 10); Пытаюсь заполнить его объектами класса...

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

Как сделать массив, доступ к элементам, в котором, возможен и по индексу и по строковому ключу?
В Visual Basic существует объект Collection. Для тех, кто не знает, это аналог массива, в котором могут храниться различные типы данных....

24
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.04.2013, 15:16
Цитата Сообщение от oxotnik Посмотреть сообщение
for(; it != tmp.end(); ++it)
не эффективный цикл, на каждой итерации идет обращение к tmp.end().

Добавлено через 2 минуты
Заменить на
C++
1
for(auto stop = tmp.end(); it != stop; ++it)
и попробовать снова.
0
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
15.04.2013, 15:20
и во втором цикле можно взять const_iterator, в теории обещают преимущества
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
15.04.2013, 15:34  [ТС]
Цитата Сообщение от yuron_477 Посмотреть сообщение
не эффективный цикл, на каждой итерации идет обращение к tmp.end().
Цитата Сообщение от abit Посмотреть сообщение
и во втором цикле можно взять const_iterator, в теории обещают преимущества
В рамках указанного количества итераций - монопенисуально, т.е. в пределах погрешности.
PS: а вопрос все же открыт.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.04.2013, 16:35
oxotnik,
В дебаге доступ по индексу работает в 2-2.5 раза быстрее, нежели итераторы,
MSVC небось? http://msdn.microsoft.com/en-u... 80%29.aspx
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
15.04.2013, 16:39  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
MSVC небось?
gcc под линуксом...
а MSVC вообще говнокомпилятор, я с ним не работаю, после того, как ловил 2 дня баг в его реализации stringstream
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.04.2013, 18:15
oxotnik, Ну ок... Вообще в debug версии вполне возможны некие проверки и для gcc. Собрано с флажком -D_GLIBCXX_DEBUG? А вообще в чем вопрос? Вполне резонно, что в debug версии итераторы будут более тормозные.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
15.04.2013, 18:45
Про дебаг написали выше, а про релиз
в релизе картина с точностью до наоборот - итераторы в 2 раза быстрее.
нужно конечно ассембреный код глянуть, но можно предположить, что итератор в релизе реализован как простой указатель и прямой доступ по указателю быстрее, чем через вызов оператора [].
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
15.04.2013, 22:08  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
Вполне резонно, что в debug версии итераторы будут более тормозные.
Меня и интересует почему...
Цитата Сообщение от Kastaneda Посмотреть сообщение
что итератор в релизе реализован как простой указатель и прямой доступ по указателю быстрее
В принципе он и в дебаге так же реализован.
Цитата Сообщение от Kastaneda Посмотреть сообщение
чем через вызов оператора [].
Только непонятно в чем между ними различие.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.04.2013, 22:48
Зависит от компилятора и ключей оптимизации. На ассемблерном-то уровне понятно, что обход через указатели быстрее обхода через индексы, но нормальный компилятор в таких вещах разбирается лучше.
И даже если ваш компилятор ничего не оптимизировал, я никогда не поверю в то, что способ получения адреса элемента ускорит обход в 2 раза - доступ к памяти никуда не делся, а ведь он пожирает ~200 процессорных тактов. Мелкая арифметика на фоне этой операции вообще ни на что не влияет.

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

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

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

Добавлено через 2 минуты
Кстати, мне лень вникать в логику второго кода, но на лвс он работает более 10 секунд. Таки есть подозрение, что циклы немного неэквивалентны.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
15.04.2013, 23:08  [ТС]
Цитата Сообщение от diagon Посмотреть сообщение
Кстати, мне лень вникать в логику второго кода, но на лвс он работает более 10 секунд. Таки есть подозрение, что циклы немного неэквивалентны.
Медленный ~20-24 с, быстрый ~10-12c. (на виртуалке).
Почему они не эквивалентны? По логике они абсолютно эквивалентны, а логика в данном случае - определяющий фактор.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.04.2013, 23:21
Цитата Сообщение от oxotnik Посмотреть сообщение
Почему они не эквивалентны? По логике они абсолютно эквивалентны, а логика в данном случае - определяющий фактор.
Потому что первый на гцц с оптимизациями выполняется за 0.1 секунду, второй - более 10 секунд.
Хотя, во втором цикле действительно не так то просто отследить, что не будет выхода за границы или чего-то подобного.
Посмотрел на асмовыхлоп гцц на первом цикле - лол, да и только.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.04.2013, 23:34
Внутри цикла по m во втором коде я вижу обнуление индекса в строках 6 и 12, а в первом коде итератор обнуляется только в строке 12 (ну и один раз до цикла). А второй раз что? Не нужно? Или это я настолько "с наскока", что ничего не понял?
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.04.2013, 07:46
grizlik78, А ведь действительно. Получается этот цикл:

C++
1
2
3
4
5
        for(; it != tmp.end(); ++it)
        {
            (*it) = i + 1;
            ++i;
        }
Выполнится единожды.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.04.2013, 09:11  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Внутри цикла по m во втором коде я вижу обнуление индекса в строках 6 и 12, а в первом коде итератор обнуляется только в строке 12 (ну и один раз до цикла). А второй раз что? Не нужно? Или это я настолько "с наскока", что ничего не понял?
Твоя правда. Если обнулять в обоих случаях, тогда одинаково примерно работают.
Можно закрывать тему.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.04.2013, 10:15
Тема сисек противостояния раскрыта не полностью. Так что же получается можно забыть про все эти итераторы и работать с индексами и не париться? Зачем два одинаковых механизма?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.04.2013, 10:20  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
раскрыта не полностью
Что не раскрыто?
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Так что же получается можно забыть про все эти итераторы и работать с индексами и не париться?
Выходит что так...
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зачем два одинаковых механизма?
У любого индивидуума должен быть выбор, таков принцип демократии.
0
18 / 18 / 1
Регистрация: 27.01.2010
Сообщений: 150
16.04.2013, 10:23
Цитата Сообщение от yuron_477 Посмотреть сообщение
не эффективный цикл, на каждой итерации идет обращение к tmp.end().

Добавлено через 2 минуты
Заменить на
C++
1
for(auto stop = tmp.end(); it != stop; ++it)
и попробовать снова.
попробуйте начать менять внутри цикла размер коллекции, и end пересчитываться не будет, поэтому изначальный вариант аналогичен конечному.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.04.2013, 10:26
Цитата Сообщение от oxotnik Посмотреть сообщение
У любого индивидуума должен быть выбор, таков принцип демократии.
Лады. Тогда где остальные дублирующие механизмы всего остального?

oxotnik, а как вы вообще замеряли скорость работы?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.04.2013, 10:28  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Тогда где остальные дублирующие механизмы всего остального?
Чего конкретно?
К примеру есть указатели, и есть ссылки.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
а как вы вообще замеряли скорость работы?
Каюсь, замерял немного кривовато, с помощюб QTime::elapsed(), но в принципе для теста хватит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2013, 10:28
Помогаю со студенческими работами здесь

Как в std::vector получить доступ к методам элементов?
Здравствуйте. Нужно что-то вроде этого: #include &lt;iostream&gt; #include &lt;vector&gt; #include &quot;box.h&quot; using namespace std; int...

Доступ по итератору к элементу вектора
Здравствуйте! Подскажите, пожалуйста, решение данной задачи: Дан вектор типа string, в нем есть два элемента. Необходимо добавить в...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Доступ к вектору по индексу как в Пайтоне?
Привет. Есть вектор с числами, хочу сначала его отсортировать, а потом вывести на экран первое число, то есть то что в индексе . В питоне...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru