С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

адаптеры - C++

04.11.2011, 20:03. Просмотров 2157. Ответов 35
Метки нет (Все метки)

добрый вечер интересно ваше мнение.
такие вещи как адаптеры, биндеры позиционируются как шибко быстро работающие.
и рекомендуется ими активно пользоваться. Например вместо попыток определить собственную шаблон-функцию сравнения, которая сравнивает входное значение с неким фиксированным значением, рекомендуется юзать биндер, который сделает нам из функции less принимающей 2 параметра для сравнения, функтор принимающий одно значение. Все это делается через создание шаблонных структур ну или классов в которых один из параметров less становится членом, и имеется небезызвестный operator()() который и используют стандартные алгоритмы, когда мы даем на вход сий класс.
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд? В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()(). Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2011, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос адаптеры (C++):

Функциональные адаптеры - C++
Для произвольного целочисленного массива данных написать функцию которая уменьшает все элементы в 2 раза с использованием функциональных...

Стандартные функторы-адаптеры - C++
Добрый вечер! Хочу отсортировать контейнер, заполненный указателями на объекты класса Class, критерий сортировки - метод этого класса. При...

Функторы, алгоритмы и адаптеры - C++
Нужна помощь! 1 Нужно создать multimap и multiset на основе элементов типа класса CPerson, содержащий в своем классе следующие...

Функторы, предикаты, функциональные адаптеры, лямбда-функции - C++
Вступление Статья ориентирована на программистов С++, поверхностно знающих/желающих узнать STL, в особенности, с использованием его...

Сетевые адаптеры! - Windows Server
Есть сервер DELL R320 под управлением Windows 2008 R2 Standart. Сняли с него образ. Имеется ещё один сервер DELL R610, RAID на нём создан с...

Адаптеры сети - Wi-Fi
Здравствуйте. Ноут asus n-series 76vb. После установки win10 начал барахлить wifi (самопроизвольно отключаться). А вчера совершенно...

35
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 20:38 #2
не думаю, что с адаптарами может быть сильно быстрее
вообще мне кажется, что эти все замашки - попытки быть похожим на функциональный язык, коим c++ не является
в общем с появлением лямбда функций в новом стандарте я не вижу сильно смысла использовать всех извращения stl'а
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,386
Записей в блоге: 2
Завершенные тесты: 1
04.11.2011, 20:38 #3
Цитата Сообщение от AzaKendler Посмотреть сообщение
В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()()
Почему, конструктор для биндера вызовется один раз, дальше будет вызываться только operator(), ну и деструктор соответственно тоже один раз. Или ты о копирующих конструкторах для элементов?


Цитата Сообщение от AzaKendler Посмотреть сообщение
Это работает действительно быстрее, чем просто вызов какой либо своей функции?
Можно умудриться написать код, который будет работать быстрее, только имхо - делать это нужно при острой необходимости. В общем случае зачем писать что-то самому, если в стандартной библиотеке уже все написанно.
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
04.11.2011, 20:40 #4
Цитата Сообщение от AzaKendler Посмотреть сообщение
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд?
Биндеры и функции это абсолютно разные вещи. Биндер просто создаёт функтор, который будет использоваться алгоритмом. Поэтому биндеры и функции, при всём желании, сравнивать нельзя
Цитата Сообщение от AzaKendler Посмотреть сообщение
В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()().
Один раз вызывается конструктор при создании объекта и один раз вызывается деструктор при его разрушении.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
По поводу функторов см. здесь
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,386
Записей в блоге: 2
Завершенные тесты: 1
04.11.2011, 20:48 #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
конструктор для биндера
блин, биндеры это функции.

Не по теме:

голова PHP забита, родной С++ забывать стал...

0
Сыроежка
Заблокирован
04.11.2011, 20:55 #6
Цитата Сообщение от AzaKendler Посмотреть сообщение
добрый вечер интересно ваше мнение.
такие вещи как адаптеры, биндеры позиционируются как шибко быстро работающие.
и рекомендуется ими активно пользоваться. Например вместо попыток определить собственную шаблон-функцию сравнения, которая сравнивает входное значение с неким фиксированным значением, рекомендуется юзать биндер, который сделает нам из функции less принимающей 2 параметра для сравнения, функтор принимающий одно значение. Все это делается через создание шаблонных структур ну или классов в которых один из параметров less становится членом, и имеется небезызвестный operator()() который и используют стандартные алгоритмы, когда мы даем на вход сий класс.
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд? В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()(). Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
По этому поводу написано в книге Майерса под названием то ли 50 приемов эффективного программирования, то ли 35 приемов эффективного программирование.
Главное преимущество адаптеров состоит в том, что если они inline, то компилятор может их встроить в алгоритм при инстанциировании. А когда используется указатель на функцию, то компилятор это не может сделать.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 21:05 #7
Цитата Сообщение от Сыроежка Посмотреть сообщение
А когда используется указатель на функцию, то компилятор это не может сделать.
когда алгоритму передается конкретная функция - с чего бы ему этого не сделать?
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:42  [ТС] #8
ну если я правильно понял то создается так называемый временный объект. т.е. мы не создаем где то там
объект класса и не суем один и тот же в алгоритм а создаем каждый раз временный объект который генерится из шаблона. Я предполагаю что конструктор вызывается чтолько раз сколько объектов контейнера надо обойти, соответственно столько же раз вызовется деструктор и оператор ()(), плюсом это все вызывается через функцию помощник. Поэтому мне и стало интересно ваше мнение. Я приложил картинку где написано что все это кул. В рамках стл это и правда кул. Универсально. Но...разве так быстро как пишут? Нельзя сравнивать функцию и биндер? почему с? в этой картиночке биндер это как раз функция помощник которая генерит класс и подсовывает его в алгоритм, и уже оператор()() этого класса делает сравнение

В общем то ответ вы дали. В принципе не быстро (или не быстрее) но в рамках стл - это правильно и удобно.
0
Миниатюры
адаптеры  
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:47  [ТС] #9
вот еще пример от него же
0
Миниатюры
адаптеры  
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 22:54 #10
В фразе "Читаемо? Эффективно?" на читаемо предназначался сарказм автора
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:58  [ТС] #11
трудно не согласится. но он все таки писал всерьез и если набить правую руку, то..вполне читаемо
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.11.2011, 23:06 #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <vector>
#include <functional>
 
bool more_then_7(int value)
{
    return value > 7;
}
 
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    std::vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
    for (size_t i=0;i<1e7;++i)
    {
#ifdef STL_WAY
        std::find_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 7));
#else
        std::find_if(v.begin(), v.end(), more_then_7);
#endif
    }
}
Bash
1
2
3
4
5
6
7
8
9
10
alexxx@alexxx-laptop:~/c++$ g++ -DSTL_WAY 1.cpp && time ./a.out 
 
real    0m5.862s
user    0m5.732s
sys 0m0.068s
alexxx@alexxx-laptop:~/c++$ g++ 1.cpp && time ./a.out 
 
real    0m4.115s
user    0m3.988s
sys 0m0.092s
Bash
1
2
3
4
5
6
7
8
9
10
alexxx@alexxx-laptop:~/c++$ g++ -DSTL_WAY -O3 1.cpp && time ./a.out 
 
real    0m0.325s
user    0m0.316s
sys 0m0.012s
alexxx@alexxx-laptop:~/c++$ g++ -O3 1.cpp && time ./a.out 
 
real    0m0.288s
user    0m0.284s
sys 0m0.004s
Собственно
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.11.2011, 00:21 #13
Добавка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <vector>
#include <functional>
 
bool more_then_7(int value)
{
        return value > 7;
}
 
int main()
{
        int arr[] = {1,2,3,4,5,6,7,8,9,10};
        std::vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
        for (size_t i=0;i<1e7;++i)
        {
#ifdef LAMBDA
                std::find_if(v.begin(), v.end(), [](const int value) {return value > 7;});
#else
                std::find_if(v.begin(), v.end(), std::bind(&more_then_7, std::placeholders::_1));
#endif
        }
}
Bash
1
2
3
4
5
6
7
8
9
10
11
forever@lavroffff:~/Programs$ g++ -DLAMBDA map_test.cpp -std=c++0x && time ./a.out
 
real    0m2.257s
user    0m2.152s
sys 0m0.000s
 
forever@lavroffff:~/Programs$ g++ map_test.cpp -std=c++0x && time ./a.out
 
real    0m7.950s
user    0m7.744s
sys 0m0.044s
Bash
1
2
3
4
5
6
7
8
9
10
forever@lavroffff:~/Programs$ g++ -O3 map_test.cpp -std=c++0x && time ./a.out
 
real    0m0.440s
user    0m0.416s
sys 0m0.000s
forever@lavroffff:~/Programs$ g++ -O3 -DLAMBDA map_test.cpp -std=c++0x && time ./a.out
 
real    0m0.162s
user    0m0.152s
sys 0m0.004s
2
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
05.11.2011, 00:45 #14
ForEveR, ты развеял мои опасения насчет эффективности лямбд)

Добавлено через 6 минут
хотя сравнение наверно не очень корректное, в случае лямбды ты функцию в принципе не вызываешь
0
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
05.11.2011, 00:52 #15
По поводу поста с измерением времени. Массивчик маловат.
Попробуйте на 100 миллионах - 1 миллиард элементов
0
05.11.2011, 00:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2011, 00:52
Привет! Вот еще темы с ответами:

Сетевые адаптеры - Сетевое оборудование
В диспетчере появился какой-то левый сетевой адаптер. Кто знает что это такое?

Не работают сетевые адаптеры на пк - Сетевое оборудование
Доброго времени суток форумчане!:) Поставил ОС windows 7 на стационарник и после этого у меня пропала сеть, т.е. вылезла ошибка...

Не работают сетевые адаптеры - Windows 10
Обновился до Win 10 с Win 8.1. Сразу после обновления столкнулся с проблемой: не работают оба сетевых адаптера. В папке Центр...

Адаптеры WI-FI: дальнобойные и с вардрайвингом. - Сетевое оборудование
Какие из адаптеров под USB порекомендуете? Необходим адаптер способный сделать линк на 500-2000метров: 1.Возможность работать с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.