Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой из методов итерации лучше, итераторы или индекс 
:(
    Опции темы
djamshud
Дата 18.12.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



В векторе он не быстрее, а может даже наоборот. Обращение по индексу - прямой доступ к данным без прослойки в виде итератора.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
GoldFinch
Дата 18.12.2009, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



djamshud, обращение по индексу - это *(base+index) а обращение через итератор это *iterator.
feel the difference
PM MAIL ICQ   Вверх
djamshud
Дата 19.12.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



GoldFinch, 

Код

int main() {
std::vector<int>vector(0xFFFFFF);
for(int i=0;i<10;i++)
for(std::vector<int>::iterator i=vector.begin();i!=vector.end();i++)
*i=0;
return 0;
}


Код

$ g++ -O0 vector.cpp -o vector && time ./vector

real    0m4.514s
user    0m4.388s
sys     0m0.040s


Код

int main() {
std::vector<int>vector(0xFFFFFF);
for(int i=0;i<10;i++)
for(int i=0;i<vector.size();i++)
vector[i]=0;
return 0;
}


Код

$ g++ -O0 vector.cpp -o vector && time ./vector

real    0m1.288s
user    0m1.227s
sys     0m0.034s


feel the difference 


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
GoldFinch
Дата 19.12.2009, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



djamshud, и что? я не юзаю гцц, я хз что это за время, и плохая оптимизация гцц - проблемы гцц

если ты хотел этим доказать что гцц - плохой компилятор, тебе это удалось, поздравляю

Это сообщение отредактировал(а) GoldFinch - 19.12.2009, 00:34
PM MAIL ICQ   Вверх
djamshud
Дата 19.12.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



GoldFinch, а при чем тут оптимизация? Мы же говорим об идее итератор Vs индекс, а не о том, как ее извратит оптимизатор. Именно поэтому оптимизация была совсем выключена.

Про цифры поясню. Процессор работает в двух режимах (реально может в большем количестве) - режиме пользователя (обычный режим, числодробления и пр) и режиме ядра (это системные вызовы, обращение к железу). Программа с итератором выполнялась 4.388 секунды в режиме пользователя и 0.040 - в режиме ядра. Всего она "прожила" 4.514 секунд (процессор был занят не толькой ей, поэтому sys+usr!=real). Программа с индексом работала почти в четыре(!) раза меньше, т.е. быстрее.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
GoldFinch
Дата 19.12.2009, 00:44 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



djamshud, жги еще

Добавлено через 2 минуты и 48 секунд
хоть и говорили недавно, что без профайлера нельзя ничего сказать о быстродействии кода,
но всетаки программисту надо самому понимать что он делает и во что компилится его код, иначе это будет называться 100%-м быдлокодингом.
PM MAIL ICQ   Вверх
djamshud
Дата 19.12.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>хоть и говорили недавно, что без профайлера нельзя ничего сказать о быстродействии кода,
но всетаки программисту надо самому понимать что он делает и во что компилится его код, иначе это будет называться 100%-м быдлокодингом.

И это говорит человек, уповающий на оптимизацию компилятора? Ууух, жгунишка!

Добавлено через 2 минуты и 9 секунд
>без профайлера нельзя ничего сказать о быстродействии кода

Т.е. на самом деле четырехкратный слив как бэ намекает нам, что программа просто разминается перед тем, как попасть в профайлер? Там то она точно даст жару!

Добавлено через 10 минут и 14 секунд
>если ты хотел этим доказать что гцц - плохой компилятор, тебе это удалось, поздравляю

Посмеялся. Блажен неведающий.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
fry
Дата 19.12.2009, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Для Zhekin,
Опред. "итерация"
И я с этим согласен.
Цитата

Какая разница между двумя способами итерации?

По твоим примерам, небольшая, однако итераторы, как мне думается, следует применять в конструкциях вроде стандартных алгоритмов или при необходимости задания некоторого порядка следования элементов при итерации (некий "интеллектуальный" вариант). В остальных случаях дело за автором кода.

ЗЫ
Сильно ИМХО: В остальных случаях предпочитаю классический вид обхода элементов массива. Думается он как-то нагляднее показывает работу кода, чем все эти .begin(), .end(), "..элемент, следующий за последним..." и остальное, т.е., иными словами, как-то проще читать код.

PM MAIL   Вверх
andrew_121
Дата 19.12.2009, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(GoldFinch @ 19.12.2009,  00:32)
djamshud, и что? я не юзаю гцц, я хз что это за время, и плохая оптимизация гцц - проблемы гцц

если ты хотел этим доказать что гцц - плохой компилятор, тебе это удалось, поздравляю

не гони. не раз было доказано, что gcc оптимизирует превосходно, и поставляемая с ним stl лучше микрософтофской.

Добавлено @ 06:16
Цитата(djamshud @  19.12.2009,  00:50 Найти цитируемый пост)
Посмеялся. Блажен неведающий. 

 smile 

Это сообщение отредактировал(а) andrew_121 - 19.12.2009, 06:16


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Леопольд
Дата 19.12.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: нет
Всего: 13



Я последнее время предпочитаю такой способ smile

Код

#include <vector>
#include <boost/foreach.hpp>
...
std::vector<Class> a;
...
BOOST_FOREACH(Class iter, a){
   iter.foo();
   iter.getElement() = calculateSomething();
   ...
}


Удобно.

Добавлено через 6 минут и 28 секунд
Цитата(djamshud @  18.12.2009,  23:21 Найти цитируемый пост)
В векторе он не быстрее, а может даже наоборот. Обращение по индексу - прямой доступ к данным без прослойки в виде итератора. 

Вероятнее всего, после оптимизации, разницы в скорости доступа не будет вообще. Ни там ни там нет проверок на выход за границы массива. Почти любой современный компилятор способен на это.

Есть ещё std::vector<Type>::at


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
djamshud
Дата 19.12.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



Леопольд, да оптимизация практически сравнивает показатели.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
W4FhLF
Дата 19.12.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(Леопольд @  19.12.2009,  09:45 Найти цитируемый пост)
Удобно.


И медленно. 

Тогда уж так:

Код

BOOST_FOREACH(Class& iter, a){


Цитата(Леопольд @  19.12.2009,  09:45 Найти цитируемый пост)
Есть ещё std::vector<Type>::at


Тоже штука тормозная. Хотя и безопасная. smile 







--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lazin
Дата 19.12.2009, 16:02 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(djamshud @  19.12.2009,  00:50 Найти цитируемый пост)
Т.е. на самом деле четырехкратный слив как бэ намекает нам, что программа просто разминается перед тем, как попасть в профайлер? Там то она точно даст жару!


Цитата(djamshud @  19.12.2009,  12:31 Найти цитируемый пост)
да оптимизация практически сравнивает показатели


ну и где слив? smile 
в отладочной версии, без оптимизации итератор будет работать медленно, оптимизация должна свести работу с итератором к работе с простым указателем, так-как по факту, в коде должно происходить именно это,  доступ к памяти через указатель smile 
а вообще да, лучше пользоваться индексами, если не предполагается смена типа контейнера, потому-что если ты используешь индексы, а потом выясняется, что тебе нужно использовать не вектор, а скажем список, то придется все переписывать
PM MAIL Skype GTalk   Вверх
djamshud
Дата 19.12.2009, 16:38 (ссылка)  | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



Lazin, не передергивайте. Во-первых, отладочная версия и без оптимизации - совершенно разные вещи. Во-вторых изначально я и написал, что индексы выиграют если и выиграют, то чуть-чуть, а про "слив" - это ответ на совсем другое заявление одного товарища. Stl-итератор запрятывает реальную работу с указателем за слои абстракций, поэтому работа через него однозначно медленнее, это все, что я хотел сказать. Оптимизация вытаскивают его из лужи, но речь то шла не про нее.

>если ты используешь индексы, а потом выясняется, что тебе нужно использовать не вектор, а скажем список, то придется все переписывать

У stl-списка нет интерфейса доступа к объектам через индекс? Бугагашеньки:).


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 19.12.2009, 16:56 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(djamshud @  19.12.2009,  16:38 Найти цитируемый пост)
Stl-итератор запрятывает реальную работу с указателем за слои абстракций, поэтому работа через него однозначно медленнее
работа с ним медленней, когда отключена оптимизация и компилятор весь код, который следовало бы встроить, делает в виде вызовов функций. Именно поэтому итератор и сливает, так как там этих вызовов больше выходит. С другой стороны, тот же доступ по индексу в векторе будет медленней, чем в простом массиве. И проблема тут не в компиляторе или идеологии работы с массивами, а в том, что генерируется специальный код, который легко отлаживать.

PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.