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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> iterator, оптимизация 
V
    Опции темы
htzg
Дата 1.5.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



   
Код

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

и
Код

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

Что быстрей работает? Или одинаково ?
PM MAIL   Вверх
toxx
Дата 1.5.2010, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

++iter

PM MAIL   Вверх
mes
Дата 1.5.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



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

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

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


--------------------
PM MAIL WWW   Вверх
toxx
Дата 1.5.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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

В разделе книги где я читал про итераторы(после темы про деревья в стиле С++), написано именно так=) блин врут и врут нагло...
Просто я почему запомнил это, т.к. дело касалось скорости, а тут увидел тему и сразу вспомнил =)
PM MAIL   Вверх
mes
Дата 2.5.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



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

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


Это сообщение отредактировал(а) mes - 2.5.2010, 01:01


--------------------
PM MAIL WWW   Вверх
htzg
Дата 2.5.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а если так
Код

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

и
Код

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

Что быстрей? Или компилятор может оптимизировать первый код?
Как узнать что компилятор оптимизирует?
PM MAIL   Вверх
mes
Дата 2.5.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
htzg
Дата 4.5.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Понятно! Спасибо всем!
PM MAIL   Вверх
bsa
Дата 7.5.2010, 00:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



htzg, на будущее - пользуйся стандартными алгоритмами, например, std::for_each. В случае его использования у тебя не будет болеть голова о ++i/i++ и создании итератора, указывающего на конец контейнера... Хотя, я считаю, что лучше всегда использовать ++i и создавать итератор.
PM   Вверх
dengalf
Дата 12.5.2010, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может не совсем в тему, но правда ли, что оператор i-- работает быстрее i++? и что самый быстрый в большинстве случаев цикл - это while с --i. если да - то в чем логика?
PM MAIL   Вверх
Леопольд
Дата 12.5.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Это сообщение отредактировал(а) Леопольд - 12.5.2010, 09:25


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


Новичок



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

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



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

Как раз тот случайsmile Алгоритм в принципе оптимизирован по максимуму, и критичны как раз такие вот "мелочи". А чего в тему оптимизации кода"для машины, а не для человека" почитать можно? Желательно конкретно для с++, без асма и ассемблерных вставок. Сейчас мучаю побитовые операции. 
PM MAIL   Вверх
mes
Дата 12.5.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 12.5.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



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

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

в любом случае надо знать асм и понимать что именно сгенерит компилятор для того или иного кода (компилировать в уме smile )
PM MAIL ICQ   Вверх
dengalf
Дата 12.5.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

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


 




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


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

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