Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Practical considerations

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 18. Boost.Lambda

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Practical considerations

Performance

Теоретически, все накладные расходы на использование алгоритмов STL и фанкторов lambda по сравнению с ручными письменными петлями могут быть оптимизированы, так же как накладные расходы от стандартных объектов функции STL и связующих устройств. В зависимости от компилятора, это также может быть правдой на практике. Мы провели два теста с компилятором GCC 3.0.4 на 1.5 ГГц Intel Pentium 4. Использовался флаг оптимизации -03.

В первом тесте мы сравнили фанкторы lambda с явно написанными объектами функции. Мы использовали оба этих стиля для определения неарочных функций, которые многократно умножают аргумент. Мы начали с функции идентификации, вплоть до x5. Выражений называли внутри std::transform, читая аргумент от одного std::vector и помещая результат в другое. Длина векторов составляла 100 элементов. Время работы указано в Table 18.3, “Test 1”. Мы можем заметить, что между этими двумя подходами нет существенной разницы.

Во втором тесте мы снова использовали std::transform для выполнения операции с каждым элементом в 100-элементном длинном векторе. На этот раз тип элемента векторов был ДП, и мы начали с очень простых арифметических выражений и перешли к более сложным. Время работы указано в Table 18.4, “Test 2”. Здесь мы также включили классические STL стиль безымянных функций в тесты. Мы не демонстрируем эти выражения, так как они становятся довольно сложными. Например, последнее выражение в Table 18.4, “Test 2”, написанное с классическими инструментами STL, содержит 7 звонков на compose2, 8 звонков на bind1st и в целом 14 призывов конструктора для создания мультипов, minus и плюс объектов. В этом тесте выражения BLL немного медленнее (примерно 10% в среднем, менее 14% во всех случаях), чем соответствующие рукописные функциональные объекты. Удар производительности немного больше с классическими выражений STL, до 27% для самых простых экспрессио.

Тесты показывают, что BLL не вводит потерю производительности по сравнению с объектами функции STL. При разумной оптимизации компилятора следует ожидать, что характеристики производительности будут сопоставимы с использованием классического STL. Более того, с простыми выражениями можно ожидать, что производительность будет близка к результату явно написанных функциональных объектов. Обратите внимание, однако, что оценка фанктора lambda состоит из последовательности звонков на небольшие функции, которые объявляются встроенными. Если компилятор фактически не расширяет эти функции в интерактивном режиме, производительность может пострадать. Время работы может более чем удвоиться, если это произойдет. Хотя вышеупомянутые тесты не включают такое выражение, мы испытали это для некоторых, казалось бы, простых выражений.

Table 18.3. Test 1

CPU time of expressions with integer multiplication written as a lambda expression and as a traditional hand-coded function object class. The running times are expressed in arbitrary units.
expressionlambda expressionhand-coded function object
x240230
x340350
x770760
x11801210
x1950 год1910 год


Table 18.4. Test 2

CPU time of arithmetic expressions written as lambda expressions, as classic STL unnamed functions (using compose2, bind1st etc.) and as traditional hand-coded function object classes. Using BLL terminology, a and b are bound arguments in the expressions, and x is open. All variables were of types double. The running times are expressed in arbitrary units.
expressionlambda expressionclassic STL expressionhand-coded function object
ax330370290
-ax350370310
ax-(a+x)470500420
(ax-(a+x))620670600
(ax) - (a+x) (bx - (b+x)) (ax - (b+x)) (bx - (a+x)))166016601460


Некоторые дополнительные тесты производительности с более ранней версией библиотеки описаны [Jär00].

About compiling

BLL использует шаблоны довольно сильно, выполняя многочисленные рекурсивные моменты тех же шаблонов. Это имеет (по крайней мере) три последствия:

  • Хотя можно писать невероятно сложные выражения ягненка, это, вероятно, не хорошая идея. Совмещение таких выражений может в конечном итоге потребовать много памяти во время компиляции и быть медленными для компиляции.

  • Типы фанкторов lambda, которые возникают даже из самых простых выражений lambda, являются зашифрованными. Обычно программисту вообще не нужно иметь дело с типами фанктора ламбды, но в случае ошибки в экспрессии ламбды компилятор обычно выводит типы гамбда. Это может сделать сообщения об ошибке очень длинными и трудными для интерпретации, особенно если компилятор выводит всю цепочку мгновенных сообщений шаблонов.

  • C++ Стандарт предполагает уровень гнездования шаблона 17, чтобы помочь обнаружить бесконечную рецессию. Сложные шаблоны lambda могут легко превысить этот предел. Большинство компиляторов допускают большее количество вложенных шаблонов, но обычно требуют, чтобы предел явно увеличивался с аргументом командной строки.

Portability

BLL работает со следующими компиляторами, то есть компиляторы способны составлять тестовые случаи, включенные в BLL:

  • GCC 3.0.4
  • KCC 4.0f с EDG 2.43.1
  • GCC 2.96 (проблемы с одним испытательным случаем, exception_test.cpp приводят к внутренней ошибке компилятора. )

Test coverage

В следующем списке описываются включенные тестовые файлы и функции, которые охватывает каждый файл:

  • bind_tests_simple.cpp: Биндное выражение различных аритмов и типов целевых функций: указатели функций, функциональные объекты и функции-члены. Функционный состав с связующими выражениями.

    bind_tests_simple.cpp : Bind expressions of different arities and types of target functions: function pointers, function objects and member functions. Function composition with bind expressions.

    [ORIG_END] -->
  • bind_tests_simple_ function_references.cpp: Повторяет все тесты от bind_tests_simple.cpp, где целевая функция является указателем функции, но вместо этого использует ссылки на функции.

  • bind_tests_advanced.cpp: Содержит тесты для вложенных выражений привязки, unlambda, protect, const_parameters и break_const. Тесты, проводящие фанкторы lambda в качестве реальных аргументов для других фанкторов lambda, карриинг и использование шаблона sig для указания типа возврата объекта функции.

  • operator_tests_simple.cpp: Тесты с использованием всех операторов, которые перегружены для выражений ламбды, то есть, неарочный и бинарный арифметика, немного, сравнение логически, прибавления и прибавки, соединение, назначение, субкрикт, адрес, Предпочтение и операторы комм. Испытывается потоковая природа операторов сдвига, а также указатели арифметики с плюсами и минусами операторов.

    operator_tests_simple.cpp : Tests using all operators that are overloaded for lambda expressions, that is, unary and binary arithmetic, bitwise, comparison, logical, increment and decrement, compound, assignment, subscrict, address of, dereference, and comma operators. The streaming nature of shift operators is tested, as well as pointer arithmetic with plus and minus operators.

    [ORIG_END] -->
  • member_pointer_test.cpp: Указатель для оператора-члена достаточно сложен, чтобы гарантировать отдельный тест-файл.

  • control_structures.cpp : Tests for the looping and if constructs.

  • switch_construct.cpp : Includes tests for all supported arities of the switch statement, both with and without the default case.

  • exception_test.cpp : Includes tests for throwing exceptions and for try/catch constructs with varying number of catch blocks.

  • constructor_tests.cpp: Содержит тесты для constructor, destructor, new_ptr, delete_ptr, new_array и delete_array.

    constructor_tests.cpp : Contains tests for constructor, destructor, new_ptr, delete_ptr, new_array and delete_array.

    [ORIG_END] -->
  • cast_test.cpp : Tests for the four cast expressions, as well as typeid and sizeof.

  • extending_return_type_traits.cpp: Испытания, расширяющие систему вычета обратного типа для определенных типов пользователей. Содержит несколько операторов, определенных пользователем, и соответствующие специализации для шаблонов вычета обратного типа.

    extending_return_type_traits.cpp : Tests extending the return type deduction system for user defined types. Contains several user defined operators and the corresponding specializations for the return type deduction templates.

    [ORIG_END] -->
  • is_instance_of_test.cpp: Включает тесты для шаблона внутренне используемых признаков, который может определить, является ли данный тип примером определенного шаблона или нет.

    is_instance_of_test.cpp : Includes tests for an internally used traits template, which can detect whether a given type is an instance of a certain template or not.

    [ORIG_END] -->
  • bll_and_function.cpp: Содержит тесты для использования boost::function вместе с фанкторами lambda.

    bll_and_function.cpp : Contains tests for using boost::function together with lambda functors.

    [ORIG_END] -->


PrevUpHomeNext

Статья Practical considerations раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 18. Boost.Lambda может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 18. Boost.Lambda ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 01:51:59/0.0053651332855225/0