![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
xTr1m |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Доброго времени суток. Решил я посмотреть есть ли причины использовать std::find_if (за одну такую фразу, думаю, многие меня побьют =))
Сделал тестовый пример. Положил в vector 10000 строк "test" и сделал два варианта поиска: find_if
поиск перебором
при m_count = 1000, find_if отработал за 4 секунды, а поиск перебором аж за 10. за счет чего так получается? Может я конечно многого не знаю, но я считал, что find_if также должен пройтись по всем элементам массива + ведь еще "тратится время" на вызов функтора. а в результате имеем, что быстрее. В чем причина? |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Можно глянуть исходники STL
|
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
потому как std::find_if() не ищет тупым перебором. а вообще, STL не зря так назвали! и не идиоты пишут стандартные алгоритмы! Это сообщение отредактировал(а) andrew_121 - 26.2.2010, 14:11 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Ozerich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 2.8.2009 Где: Минск, Беларусь Репутация: нет Всего: 5 |
А разве возможно искать что то не в отсортированном массиве, не используя перебор? ![]() --------------------
C++(STL) / DHTML(CSS) / Javascript / PHP Developer |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Вот я прошу хотя бы намекнуть, как можно организовать поиск в неупорядоченном массиве без прохождения его всего. А в моем случае поиск как раз проходит по всем элементам, так как я ищу элемент, которого там нет.
|
|||
|
||||
chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
xTr1m, а почему ты решил что узкое место именно перебор? может тормоз сравнение?!
Добавлено через 1 минуту и 17 секунд ЗЫ какова смысловая нагрузка "for(int y=0; y<m_count; ++y)" ? |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Смысловая нагрузка
просто, чтобы время увеличить кол-во поисков, чтобы время выполнения измерялось секундами. А сравнение то везде одинаково. собственно бог с ним, со сравнением. меня интересует, что же такое происходит во время find_if, может он просто не по всем элементам проходит =))) Чего исходник пока найти не могу |
|||
|
||||
Ozerich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 2.8.2009 Где: Минск, Беларусь Репутация: нет Всего: 5 |
Искать в неотсортированном массиве быстрее чем за линейное время не возможно. Используя бинарный поиск мы за log N(N - длина массива) можем найти элемент но массив должен быть отсортирован.
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP Developer |
|||
|
||||
andrew_121 |
|
||||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
я ставил акцент на слово - тупым. вот код из STL поставляемой с gcc-4.5.0
хороша оптимизация? ![]() -------------------- Удалил аккаунт. Прощайте! |
||||
|
|||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
О, спасибо. С ходу не осилил, приду домой - буду курить.
|
|||
|
||||
Shaggie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Прибавь к этому ещё два небольших момента.
У тебя в цикле end() вычисляется каждый раз заново (даже если это всего лишь разница между указателями), а в find_if() приезжает уже готовое значение. Код функтора встраивается и оверхеда на его вызов нет. Цикл сам по себе штука медленная, поэтому для оптимизации их разворачивают. Где-то это делает умный компилятор, где-то разработчики time critical библиотек общего назначения (как в данном случае), в отдельных грустных случаях разворачивать цикл приходится самому программисту. В данном случае на один шаг цикла происходит четыре операции сравнения. |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Может за счет того, что твой Functor всегда возвращает false? Компилятор вообще имеет право вообще удалить вызов и find_if и охватывающего цикла |
||||
|
|||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
xvr, надеюсь он так не самовольничает =)
|
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Почему-то мне кажется что время замерялось на дебаг версии. Попробуй замерить на релизах... ![]() Это сообщение отредактировал(а) Леопольд - 26.2.2010, 18:29 -------------------- вопросов больше чем ответов |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Почему бы нет - все функции inline, не имеют побочных эффектов, функтор константа. Вполне может все свернуть. Вот если привести функтор в соотвествие с тем, что было написано для 2й версии, тогда можно сравнивать |
|||
|
||||
xTr1m |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Пошел еще немного дальше
find_if отрабатывает на порядок быстрее (вектор заполнен интами от 0 до 1000000)!!!! хотя....что то у меня странные результаты получаются. сейчас вроде бы одинаковое время показывают Это сообщение отредактировал(а) xTr1m - 26.2.2010, 23:25 |
||||
|
|||||
xTr1m |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
посмотрел я файл <algorithm> и там такое
я что то не понял, STL везде разный? это я про
|
||||
|
|||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
кстати, разница во времени какая? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Так в том то и дело, что та разница, которую я указал в первом посте и достигается за счет это (микрософтской) реализации find_if, и в ней нет оптимизации цикла,
так за счет чего тогда она выигрывает? =)) |
|||
|
||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
![]() ms версия содержит средства для отладки, что-бы их отключить, нужно до включения заголовочных файлов STL написать -
Добавлено через 3 минуты и 50 секунд
возможно это из-за того, что во время работы find_if - данные уже "горячие", то-есть лежат в кэше, а при первом проходе find - они "холодные", из-за чего происходит большое количество кэш промахов |
||||||
|
|||||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Так в том то и дело, что та разница, которую я указал в первом посте и достигается за счет это (микрософтской) реализации find_if, и в ней нет оптимизации цикла,
так за счет чего тогда она выигрывает? =)) |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Так в том то и дело, что та разница, которую я указал в первом посте и достигается за счет это (микрософтской) реализации find_if, и в ней нет оптимизации цикла,
так за счет чего тогда она выигрывает? =)) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Попробуй сравнить свой исходный код с этим:
|
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
в общем то сейчас не особо заметна разница (мерил на глаз без времени)
|
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
в общем то сейчас не особо заметна разница (мерил на глаз без времени)
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
нагло лжешь. в одной из последних тем по этому поводу, ты сам принимал участие. но видимо "случайно" забыл ![]() -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ссылку, или небыло
|
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
при нежелании что-то признавать, любые аргументы будут опущены.
если любопытно, и не боишься признать ацтойность того чем пользуешься, скомпиль любой код использующий STL разными компиляторами, и сравни. зачем себя цитировать? нелепо выглядит. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
andrew_121, давай тесты качества бинарного кода который генерит msvc юзая STL майкрософта VS g++ юзая STL gcc
разумеется с учетом различных опций компиляции, в том числе дебаг-версии Это сообщение отредактировал(а) GoldFinch - 1.3.2010, 19:09 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
GoldFinch,
1. нужно утвердить какой-то код. 2. каким образом сравнивать бинарники?(или же асмовый выход?) -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
andrew_121,
1. не вижу принципиальной разницы какой код сравнивать, лишь бы там было побольше STL и поменьше CRT, других либ и пользовательского кода. 2. асм вывод компилятора, или дизасм - имхо без разницы, выглядит почти одинаково, хотя лучше бы Intel синтаксис, а не AT&T |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
а что мне признавать? в той теме сравнивали массив и вектор, а вовсе не разные реализации STL. Я перечитал тему, и не нашел нормальное сравнение стандартных библиотек.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
опять переиначил. себе.
с простыми - да. так какой код сравнивать будем? есть что-то подходящее? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
я всего-лишь попросил тебя не бросаться такими громкими фразами безосновательно, так почему я теперь должен что-то доказывать себе? лол если для тебя так важно, кричать на форумах, что dinkumware stl - отстой, то докажи это, иначе - кыш отсюда трололо ![]() |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Посмею заметить, что доля правды в этом высказывании есть. К тому же, временами сам этим грешу... ![]() -------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
На самом деле существенно различаться реализации STL не могут, так как стандарт диктует свои правила, практически все алгоритмы ограничены в сложности, а если find работает с логарифмической сложностью, то большой разницы быть не может, не так уж и много возможных реализаций, в реализации STL от gcc используют Устройство Даффа для оптимизации некоторых циклов, это дает небольшой прирост производительности, но я не думаю что разница будет заметна и скорее всего каждый пишет STL с учетом специфики оптимизатора родного компилятора.
Это сообщение отредактировал(а) azesmcar - 3.3.2010, 09:47 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |