1 | |||||||||||
std::vector доступ по индексу vs доступ по итератору15.04.2013, 13:30. Показов 12479. Ответов 24
Метки нет Все метки)
(
в релизе картина с точностью до наоборот - итераторы в 2 раза быстрее. Как сие можно объяснить?
0
|
|
15.04.2013, 13:30 | |
Ответы с готовыми решениями:
24
Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>... Доступ к индексу пиктограммы Как сделать массив, доступ к элементам, в котором, возможен и по индексу и по строковому ключу? Как в std::vector получить доступ к методам элементов? |
15.04.2013, 15:16 | 2 | |||||
не эффективный цикл, на каждой итерации идет обращение к tmp.end().
Добавлено через 2 минуты Заменить на
0
|
385 / 362 / 109
Регистрация: 03.02.2013
Сообщений: 1,109
|
|
15.04.2013, 15:20 | 3 |
и во втором цикле можно взять const_iterator, в теории обещают преимущества
0
|
В астрале
![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.04.2013, 16:35 | 5 |
oxotnik,
0
|
В астрале
![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.04.2013, 18:15 | 7 |
oxotnik, Ну ок... Вообще в debug версии вполне возможны некие проверки и для gcc. Собрано с флажком -D_GLIBCXX_DEBUG? А вообще в чем вопрос? Вполне резонно, что в debug версии итераторы будут более тормозные.
0
|
15.04.2013, 18:45 | 8 |
Про дебаг написали выше, а про релиз
0
|
Higher
|
|
15.04.2013, 22:48 | 10 |
Зависит от компилятора и ключей оптимизации. На ассемблерном-то уровне понятно, что обход через указатели быстрее обхода через индексы, но нормальный компилятор в таких вещах разбирается лучше.
И даже если ваш компилятор ничего не оптимизировал, я никогда не поверю в то, что способ получения адреса элемента ускорит обход в 2 раза - доступ к памяти никуда не делся, а ведь он пожирает ~200 процессорных тактов. Мелкая арифметика на фоне этой операции вообще ни на что не влияет. Обновил страничку :) Да, слона то я и не приметил. Если не использовать магические ключики оптимизаций, то [] не заинлайнится. Хотя, такое таки маловероятно - сложно представить себе человека, который задумывается о перформансе и при этом не включил хотя бы -O1. Тогда, если оптимизация таки использовалась, дело в том, что компилятор предпринял разные оптимизации для этих циклов. Добавлено через 2 минуты Кстати, мне лень вникать в логику второго кода, но на лвс он работает более 10 секунд. Таки есть подозрение, что циклы немного неэквивалентны.
0
|
Higher
|
|
15.04.2013, 23:21 | 12 |
Потому что первый на гцц с оптимизациями выполняется за 0.1 секунду, второй - более 10 секунд.
Хотя, во втором цикле действительно не так то просто отследить, что не будет выхода за границы или чего-то подобного. Посмотрел на асмовыхлоп гцц на первом цикле - лол, да и только.
0
|
![]() 2380 / 1664 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
15.04.2013, 23:34 | 13 |
Внутри цикла по m во втором коде я вижу обнуление индекса в строках 6 и 12, а в первом коде итератор обнуляется только в строке 12 (ну и один раз до цикла). А второй раз что? Не нужно? Или это я настолько "с наскока", что ничего не понял?
2
|
В астрале
![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
16.04.2013, 07:46 | 14 | |||||
grizlik78, А ведь действительно. Получается этот цикл:
0
|
Почетный модератор
![]() 5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
16.04.2013, 10:15 | 16 |
Тема
0
|
18 / 18 / 1
Регистрация: 27.01.2010
Сообщений: 150
|
|
16.04.2013, 10:23 | 18 |
попробуйте начать менять внутри цикла размер коллекции, и end пересчитываться не будет, поэтому изначальный вариант аналогичен конечному.
0
|
Почетный модератор
![]() 5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
16.04.2013, 10:26 | 19 |
Лады. Тогда где остальные дублирующие механизмы всего остального?
oxotnik, а как вы вообще замеряли скорость работы?
0
|
16.04.2013, 10:28 [ТС] | 20 |
Чего конкретно?
К примеру есть указатели, и есть ссылки. Каюсь, замерял немного кривовато, с помощюб QTime::elapsed(), но в принципе для теста хватит.
0
|
16.04.2013, 10:28 | |
16.04.2013, 10:28 | |
Помогаю со студенческими работами здесь
20
Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |