0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 13
|
||||||
1 | ||||||
Какова польза лямбда выражений17.03.2014, 13:05. Показов 3987. Ответов 31
Метки нет (Все метки)
Вот набросал пример который показывает что лямбда выражения медленней простых циклов и больше кода, в чем тогда их польза ?
0
|
17.03.2014, 13:05 | |
Ответы с готовыми решениями:
31
Использование лямбда-выражений в STL Поддержка лямбда-выражений Дебаггинг анонимных методов и лямбда-выражений Переопределить метод ToString() на основе лямбда-выражений |
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
17.03.2014, 13:25 | 3 |
Фраза
звучит как "удобрения медленнее лопаты". Абсурд не правда ли? Сами по себе лямбда выражения - это синтаксический сахар для функторов. В С++ до этого не существовало способа сделать анонимный функтор, теперь такой способ есть, + некоторые плюшки (вроде захвата переменных). То, что ты там в своем примере заюзал стандартные алгоритмы с таким функтором и получил просадку производительности по сравнению с голым циклом, вообще никак лямбды не характеризует. Характеризует только то, что тест некорректный.
1
|
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 13
|
|
17.03.2014, 13:33 [ТС] | 4 |
в чем не корректность теста ?
И что тогда лучше использовать в местах с простыми циклами, лямбда или циклы(итераторы) ? Еще так к месту, конструкторы перемещения дают очень небольшой прирост производительности (в 1,04873245 раза). Использовал самые простые конструкции, может быть лямбда можно как-то лучше приготовить ?
0
|
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
17.03.2014, 13:40 | 6 |
В том, что ты сравниваешь совершенно разные подходы к решению задачи. Выбрав при этом условия задачи такими, что подход с голыми циклами оказывается быстрее. Для корректности нужно было сравнивать лямбды с обычными С++ функторами (которые классы).
От задачи зависит. И от целей. Озвучь конкретную задачу, будем ее рассматривать. И еще раз скажу, лямбды - это функторы (то есть функциональные объекты, то есть объекты, которые ведут себя как функции). Ее совсем не обязательно в цикл пихать. А это зависит от характера данных. Нельзя так просто в общем случае утверждать.
0
|
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 13
|
|
17.03.2014, 13:41 [ТС] | 7 |
А цикл быстрее лямбда быстрее в 1,240681149 раза (видимо за счет создания временной структуры в каждой итерации).
0
|
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
17.03.2014, 13:43 | 8 |
Не цикл быстрее лямбды, а цикл быстрее подхода с использованием стандартного алгоритма в этой конкретной ситуации.
1
|
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 13
|
|
17.03.2014, 13:54 [ТС] | 9 |
В данном тесте я проверял только скорость передачи данных из локальной области видимости во внешнюю область видимости (фактически скорость return), данные не суть важно какие, просто небольшой массив байт. Не думаю что из безымянных структур можно создавать какие-то сложные конструкции, по этому предполагаю что лямда и подразумевает использование в небольших локальных конструкциях с stl.algorithm.
Добавлено через 5 минут Смысла нет, т.к. это одно и тоже только по разному записано, т.е. лямда при компиляции преобразуется в класс.
0
|
Неэпический
|
||||||
17.03.2014, 14:02 | 10 | |||||
просто для примера:
1
|
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 13
|
|
17.03.2014, 14:21 [ТС] | 11 |
В моем примере оптимизация компилятора почти что уравнивает по скорости конструктор копирования и перемещения при возврате результата, по этому разница в скорости различима только для циклов и лямбда.
Вывод в консоль такой (gcc 4.7.3): copy: 182104 copy lambda: 225933 move: 173642 move lambda: 222386
0
|
Неэпический
|
||||||
17.03.2014, 14:55 | 13 | |||||
Чуть поменял, чтобы не было автоматических переменных в некоторых местах, которые будут не копироваться, а перемещаться
1
|
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 13
|
||||||
17.03.2014, 15:50 [ТС] | 15 | |||||
в общем разъяснил ситуацию лямбда, результат прямо противоположный:
data pushback lambda: 53000 lambda back_inserter: 194452 for counter: 220521 data modify lambda: 10275 for iterator: 61350 for counter: 120558 Добавлено через 6 минут Скомпилено с оптимизацией без дебага ?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
17.03.2014, 15:54 | 17 |
volodja-, в одном случае для вектора сразу сделан resize, в другом - вставка back_inserter'ом, и, как следствие, перевыделения памяти и копирования объектов. В общем, я не понимаю что вы пытаетесь измерить.
0
|
Неэпический
|
|
17.03.2014, 16:04 | 18 |
ну перевыделения врядли будут, ибо data.clear() лишь очищает вектор, но не освобождает память и выделенного куска хватит для следующего теста
угу, поэтому ответ - теплое с мягким. Сравнивает изменение элементов(generate) с их вставкой(push_back)
0
|
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 13
|
|
17.03.2014, 16:05 [ТС] | 19 |
Согласен, пункт lambda: 53000 можно отбросить, не нашел пока способа вызывать push_back из лямбда. Но пункты в data modify выглядят достоверно.
0
|
Неэпический
|
||||||
17.03.2014, 16:09 | 20 | |||||
а если так?
0
|
17.03.2014, 16:09 | |
17.03.2014, 16:09 | |
Помогаю со студенческими работами здесь
20
В чем разница лямбда-выражений и анонимных методов? Программа с использованием делегатов, анонимных методов и лямбда-выражений Реализовать с применением функционалов и лямбда-выражений следующую функцию Реализовать заданные функции при помощи лямбда-выражений Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |