![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
День добрый. Случайно играясь с производительностью, получил очень странный для меня результат. Функция двоичного поиска для вектора и "сырого" массива
То есть все одинаковое, кроме способа обращения к элементу (хотя и он по большому счету схож). Прогнав данные функции 1000000 раз по отсортированному массиву от 1 до 1000000 я получил, что вектор осилил это за 2,5 сек против 0,15 для "сырого" массива. Все это для дебага, но разница в 16 раз (обычный std::find вообще свыше 120 сек). Я конечно понимаю, что вектор функциональнее и уже готовое решение (с большей возможностью для расширения / изменения) и в конце концов стандарт, но какова цена? Может я не так меряю? |
|||
|
||||
| Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: 1 Всего: 2 |
Попробуйте все-таки в релизе.
--------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
xTr1m, вообще-то, в STL есть уже двоичный поиск - upper_bound и lower_bound. Может стоит не изобретать велосипед?
Думаю, в релизе скорость работы сравняется. |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
То, что поиск есть я знаю, это я уже так, для себя. Попробовал в релизе, действительно стало сравнимо. Но, что он там делает то? Вроде, строк типа
я там не видел. хотя все равно разница есть. Вектор = 0.18, Массив = 0. Но это уже для 2000000 прогонов. Добавлено через 14 минут и 31 секунду Все равно возникает ощущение, что те, кто придумывает свой велосипед иногда правы. Это сообщение отредактировал(а) xTr1m - 8.5.2013, 16:40 |
|||
|
||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
У меня тоже в релизе вектор чуть отстает:
сборка так: g++ -std=c++11 -O3 binary_search_perfo.cpp выводит: vector: 0.462927 sec array: 0.401723 sec причем чиселки стабильные, пара цифр после запятой не меняется вообще |
|||
|
||||
| Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: 1 Всего: 2 |
Вектор может еще отставать из-за проверки на выход за пределы массива.
--------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
| kamre |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
А где здесь проверка на выход за границы:
? По идее при вызове этого оператора всегда есть лишняя косвенность, но оптимизатор должен обнаружить общее выражение "this->_M_impl._M_start", значение которого не меняется внутри функции, и не перевычислять каждый раз. |
||||
|
|||||
| Static |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 6.11.2008 Репутация: 1 Всего: 2 |
Не знаю --------------------
Я не настолько безнадежен, как кажется... |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Никогда не нужно измерять скорость приплюснутого кода в дебаге. Никогда! При включенной оптимизации, разница будет составлять проценты. Массив быстрей будет, по любому, но не значительно. да, вот это похоже на реальные цифры |
|||
|
||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
ну например, псевдокод vector [2] = 3; это будет скомпилировано как-то так ==> int * p = vector.pointer; p[2] = 3; Вектор, это структура, и чтобы взять указатель, нужно одно лишнее действие. Хотя в идеале, конечно, оптимизатор должен и это соптимизировать, Не исключаю реализаций, где разница будет сведена к нулю. по крайней мере для таких простых выражений. В общем же случае, вектор всегда будет чуток помедленее. Небольшая плата, за большое удобство. |
|||
|
||||
| VSB |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 23.8.2007 Репутация: 1 Всего: 2 |
В студии есть дополнительные проверки, по умолчанию включенные в дебаге, чтобы проще отлаживать было. Подробнее - http://msdn.microsoft.com/en-us/library/aa985872.aspx
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |