Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 20:03     адаптеры #1
добрый вечер интересно ваше мнение.
такие вещи как адаптеры, биндеры позиционируются как шибко быстро работающие.
и рекомендуется ими активно пользоваться. Например вместо попыток определить собственную шаблон-функцию сравнения, которая сравнивает входное значение с неким фиксированным значением, рекомендуется юзать биндер, который сделает нам из функции less принимающей 2 параметра для сравнения, функтор принимающий одно значение. Все это делается через создание шаблонных структур ну или классов в которых один из параметров less становится членом, и имеется небезызвестный operator()() который и используют стандартные алгоритмы, когда мы даем на вход сий класс.
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд? В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()(). Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.11.2011, 20:38     адаптеры #2
не думаю, что с адаптарами может быть сильно быстрее
вообще мне кажется, что эти все замашки - попытки быть похожим на функциональный язык, коим c++ не является
в общем с появлением лямбда функций в новом стандарте я не вижу сильно смысла использовать всех извращения stl'а
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.11.2011, 20:38     адаптеры #3
Цитата Сообщение от AzaKendler Посмотреть сообщение
В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()()
Почему, конструктор для биндера вызовется один раз, дальше будет вызываться только operator(), ну и деструктор соответственно тоже один раз. Или ты о копирующих конструкторах для элементов?


Цитата Сообщение от AzaKendler Посмотреть сообщение
Это работает действительно быстрее, чем просто вызов какой либо своей функции?
Можно умудриться написать код, который будет работать быстрее, только имхо - делать это нужно при острой необходимости. В общем случае зачем писать что-то самому, если в стандартной библиотеке уже все написанно.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
04.11.2011, 20:40     адаптеры #4
Цитата Сообщение от AzaKendler Посмотреть сообщение
Так вот поделитесь мнением, действительно ли через биндеры это шибко быстрее, чем через просто функцию, на ваш взгляд?
Биндеры и функции это абсолютно разные вещи. Биндер просто создаёт функтор, который будет использоваться алгоритмом. Поэтому биндеры и функции, при всём желании, сравнивать нельзя
Цитата Сообщение от AzaKendler Посмотреть сообщение
В процессе работы алгоритма ну например форич, при такой схеме во первых вызывается конструктор столько раз сколько элементов надо пройти, вызывается деструктор столько же раз, ну и вызывается сам operator()().
Один раз вызывается конструктор при создании объекта и один раз вызывается деструктор при его разрушении.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Это работает действительно быстрее, чем просто вызов какой либо своей функции? Как считаете?
По поводу функторов см. здесь
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.11.2011, 20:48     адаптеры #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
конструктор для биндера
блин, биндеры это функции.

Не по теме:

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

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

В общем то ответ вы дали. В принципе не быстро (или не быстрее) но в рамках стл - это правильно и удобно.
Миниатюры
адаптеры  
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:47  [ТС]     адаптеры #9
вот еще пример от него же
Миниатюры
адаптеры  
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.11.2011, 22:54     адаптеры #10
В фразе "Читаемо? Эффективно?" на читаемо предназначался сарказм автора
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.11.2011, 22:58  [ТС]     адаптеры #11
трудно не согласится. но он все таки писал всерьез и если набить правую руку, то..вполне читаемо
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
Собственно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
05.11.2011, 00:45     адаптеры #14
ForEveR, ты развеял мои опасения насчет эффективности лямбд)

Добавлено через 6 минут
хотя сравнение наверно не очень корректное, в случае лямбды ты функцию в принципе не вызываешь
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
05.11.2011, 00:52     адаптеры #15
По поводу поста с измерением времени. Массивчик маловат.
Попробуйте на 100 миллионах - 1 миллиард элементов
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
05.11.2011, 01:02     адаптеры #16
ValeryLaptev, это уже отдельный тест
stl'ские функторы предназначены не только для массивов миллионной размерности
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
05.11.2011, 01:14     адаптеры #17
Цитата Сообщение от alex_x_x Посмотреть сообщение
ValeryLaptev, это уже отдельный тест
stl'ские функторы предназначены не только для массивов миллионной размерности
В реальных задачах не обрабатывают один маленький массив миллион раз. А вот миллионные массивы - это ближе к реальности. У меня в задаче матрица - 625 миллионов узлов.
STL-ные алгоритмы давят на векторе по скорости любые мои "доморощенные" алгоритмы. Бывает, что совсем немного, процентов на 5-7-10, но выигрывают. Осталось только на ассемблерной вставке написать - только это еще не попробовал...
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
05.11.2011, 01:28     адаптеры #18
ValeryLaptev, ну применение их общее
спор не идет об эффективности алгоритмов в связке с контейнерами(тут все и так очевидно) - речь идет об использовании адаптеров и биндеров
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
05.11.2011, 01:59     адаптеры #19
Цитата Сообщение от alex_x_x Посмотреть сообщение
ValeryLaptev, ну применение их общее
спор не идет об эффективности алгоритмов в связке с контейнерами(тут все и так очевидно) - речь идет об использовании адаптеров и биндеров
Об эффективности использования, что и пытаются доказать измерениями.
Поэтому и нужно проверить на много миллионных массивах...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2011, 13:11     адаптеры
Еще ссылки по теме:

C++ Функторы, алгоритмы и адаптеры
Windows 7 Сетевые адаптеры на SONY Vaio
Не работают сетевые адаптеры на пк

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
05.11.2011, 13:11     адаптеры #20
Цитата Сообщение от AzaKendler Посмотреть сообщение
Я предполагаю что конструктор вызывается чтолько раз сколько объектов контейнера надо обойти, соответственно столько же раз вызовется деструктор и оператор ()()
Это так сложно проверить(чтобы убедиться, что это не так)?
Цитата Сообщение от AzaKendler Посмотреть сообщение
плюсом это все вызывается через функцию помощник.
Нет никаких функций помощников, через которые что-то там вызывается... Есть функции "редакторы связей", которые "связывают" параметр функции/функтора с определённым значение, и возвращают новый функтор. Всё это происходит до начала работы функции-алгоритма и никак не влияет на то, что будет происходить внутри.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Но...разве так быстро как пишут?
Да. Все дело во встраивании.
Цитата Сообщение от AzaKendler Посмотреть сообщение
Нельзя сравнивать функцию и биндер? почему с? в этой картиночке биндер это как раз функция помощник которая генерит класс и подсовывает его в алгоритм, и уже оператор()() этого класса делает сравнение
Повторюсь, "редактор связей" не участвует в работе функции-алгоритма, в ней участвует функтор, cледовательно сравнивать можно только функтор и функцию.
Yandex
Объявления
05.11.2011, 13:11     адаптеры
Ответ Создать тему
Опции темы

Текущее время: 15:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru