Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > iterator


Автор: htzg 1.5.2010, 22:59
   
Код

    for( string::iterator iter = s.begin(),iterend = s.end() ; iter != iterend ; iter++)

и
Код

    for( string::iterator iter = s.begin() ; iter !=  s.end()  ; iter++)

Что быстрей работает? Или одинаково ?

Автор: toxx 1.5.2010, 23:35
Знаю, что по возможности нужно использовать префиксный итератор, т.к. префиксный итератор в отличии от постфиксного не возвращает старое значение, которое храниться во временном объекте.
Код

++iter

Автор: mes 1.5.2010, 23:37
без проведения теста для конкретной реализации на конкретном компиляторе, ответить на этот вопрос  затруднительно..
явно одно, что для подавляющего большинства задач, подобная оптимизация бесмыслена, так как выйгрыш, если и будет, то будет все равно не сушественнен на фоне остальных издержек.. Т.е. в первую очередь оптимизируйте алгоритм, а не то, с чем и компиляжтор сам в состоянии справится.
smile

Добавлено через 1 минуту и 39 секунд
Цитата(toxx @  1.5.2010,  22:35 Найти цитируемый пост)
, т.к. префиксный итератор в отличии от постфиксного не возвращает старое значение, которое храниться во временном объекте.

дело не в возвращении (возврашают значение оба), а в "лишней" создании копии
smile

Автор: toxx 1.5.2010, 23:45
Код

дело не в возвращении (возврашают значение оба), а в "лишней" создании копии

В разделе книги где я читал про итераторы(после темы про деревья в стиле С++), написано именно так=) блин врут и врут нагло...
Просто я почему запомнил это, т.к. дело касалось скорости, а тут увидел тему и сразу вспомнил =)

Автор: mes 2.5.2010, 01:01
Цитата(toxx @  1.5.2010,  22:45 Найти цитируемый пост)
написано именно так=) блин врут и врут нагло...

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

Автор: htzg 2.5.2010, 08:35
а если так
Код

for(int i = 0 ; i < s.size() ; i++) // 1

и
Код

for(int i = 0, j = s.size(); i < j ; i++) // 2

Что быстрей? Или компилятор может оптимизировать первый код?
Как узнать что компилятор оптимизирует?

Автор: mes 2.5.2010, 10:17
Цитата(htzg @  2.5.2010,  07:35 Найти цитируемый пост)
Что быстрей? Или компилятор может оптимизировать первый код?
Как узнать что компилятор оптимизирует? 

все что может, и с каждой новой версией компилятора все больше и больше, и поэтому если это не критический к скорости участок, то нужно писать, думая не о  мелкой оптимизации, а о качестве алгоритме решения задачи - потому как во втором вопросе компилятор помочь не может и все зависит от программиста.
smile

Автор: htzg 4.5.2010, 21:12
Понятно! Спасибо всем!

Автор: bsa 7.5.2010, 00:09
htzg, на будущее - пользуйся стандартными алгоритмами, например, std::for_each. В случае его использования у тебя не будет болеть голова о ++i/i++ и создании итератора, указывающего на конец контейнера... Хотя, я считаю, что лучше всегда использовать ++i и создавать итератор.

Автор: dengalf 12.5.2010, 08:17
Может не совсем в тему, но правда ли, что оператор i-- работает быстрее i++? и что самый быстрый в большинстве случаев цикл - это while с --i. если да - то в чем логика?

Автор: Леопольд 12.5.2010, 09:24
Цитата(dengalf @  12.5.2010,  08:17 Найти цитируемый пост)
Может не совсем в тему, но правда ли, что оператор i-- работает быстрее i++?
Видимо имеется ввиду результат компиляции в x86 ассемблер. Я его толком не знаю, помнится там есть спец. инструкция для проверки на ноль. В любом случае, не стоит на этом зацикливаться, если только не пишешь под крайне жесткие условия (реалтайм ОС) и профилирование выдает достаточно ощутимый прирост.
Всё таки, в общем случае, программы надо писать для человека, а не для машины. Корректность важнее быстродействия.

Автор: dengalf 12.5.2010, 09:39
Цитата(Леопольд @  12.5.2010,  09:24 Найти цитируемый пост)
если только не пишешь под крайне жесткие условия (реалтайм ОС) и профилирование выдает достаточно ощутимый прирост

Как раз тот случайsmile Алгоритм в принципе оптимизирован по максимуму, и критичны как раз такие вот "мелочи". А чего в тему оптимизации кода"для машины, а не для человека" почитать можно? Желательно конкретно для с++, без асма и ассемблерных вставок. Сейчас мучаю побитовые операции. 

Автор: mes 12.5.2010, 10:00
Цитата(dengalf @  12.5.2010,  08:39 Найти цитируемый пост)
Алгоритм в принципе оптимизирован по максимуму, и критичны как раз такие вот "мелочи"

мм.. скажем так, этих мелочей при включенной оптимизации в результативном коде не остается 
smile

Автор: GoldFinch 12.5.2010, 10:01
dengalf, --i лучше тем что не надо сравнивать с size, сравнение с нулем произойдет само
однако я бы не стал делать такую оптимизацию, она почти ничего не даст,к тому же компилятор и сам может заменить порядок обхода

Добавлено через 1 минуту и 32 секунды
Цитата(dengalf @  12.5.2010,  10:39 Найти цитируемый пост)
Желательно конкретно для с++, без асма и ассемблерных вставок.

в любом случае надо знать асм и понимать что именно сгенерит компилятор для того или иного кода (компилировать в уме smile )

Автор: dengalf 12.5.2010, 10:41
Спасибо.

Автор: htzg 12.5.2010, 18:40
Цитата(bsa @  7.5.2010,  00:09 Найти цитируемый пост)
на будущее - пользуйся стандартными алгоритмами, например, std::for_each

это идея!!! smile)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)