
UPD: схема заменена на вариант с контейнерами из С++11, соавторы — в комментариях ниже

Пользователь
Привет, коллеги!
Я расскажу о библиотеке для Питона с лаконичным названием f
. Это небольшой пакет с функциями и классами для решения задач в функциональном стиле.
— Что, еще одна функциональная либа для Питона? Автор, ты в курсе, что есть fn.py и вообще этих функциональных поделок миллион?
— Да, в курсе.
Всё началось с того, что мне понадобилось написать функцию, принимающую на себя владение произвольным объектом. Казалось бы, что может быть проще:
template <typename T>
void f (T t)
{
// Завладели экземпляром `t` типа `T`.
...
// Хочешь — переноси.
g(std::move(t));
// Не хочешь — не переноси.
...
}
Но есть один нюанс: требуется, чтобы принимаемый объект был строго rvalue
. Следовательно, нужно:
lvalue
.А вот это уже сложнее сделать.
Поясню.
Теперь, когда мы понимаем основные принципы Rx, настало время научиться создавать и управлять последовательностями. Стиль управления последовательностями был позаимствован у оригинального C# LINQ, который в свою очередь был вдохновлен функциональным программироанием. Мы поделим все операции по темам, которые отсортированы в порядке возрастания сложности операций. Большинство операторов Rx управляют уже существующими последовательностями, но для начала мы научимся их создавать.
100.000 вызовов, 20 итераций теста, x86 | 100.000 вызовов, 20 итераций теста, x64 | 1.000.000 вызовов, 10 итераций теста, x86 | 1.000.000 вызовов, 10 итераций теста, x64 | |
---|---|---|---|---|
Прямой вызов | Min: 1 ms Max: 1 ms Mean: 1 ms Median: 1 ms Abs: 1 |
Min: 1 ms Max: 1 ms Mean: 1 ms Median: 1 ms Abs: 1 |
Min: 7 ms Max: 8 ms Mean: 7,5 ms Median: 7,5 ms Abs: 1 |
Min: 5 ms Max: 6 ms Mean: 5,2 ms Median: 5 ms Abs: 1 |
Вызов через отражение | Min: 32 ms Max: 36 ms Mean: 32,75 ms Median: 32,5 ms Rel: 32 |
Min: 35 ms Max: 44 ms Mean: 36,5 ms Median: 36 ms Rel: 36 |
Min: 333 ms Max: 399 ms Mean: 345,5 ms Median: 338 ms Rel: 45 |
Min: 362 ms Max: 385 ms Mean: 373,6 ms Median: 376 ms Rel: 75 |
Вызов через делегат | Min: 64 ms Max: 71 ms Mean: 65,05 ms Median: 64,5 ms Rel: 64 |
Min: 72 ms Max: 86 ms Mean: 75,95 ms Median: 75 ms Rel: 75 |
Min: 659 ms Max: 730 ms Mean: 688,8 ms Median: 689,5 ms Rel: 92 |
Min: 746 ms Max: 869 ms Mean: 773,4 ms Median: 765 ms Rel: 153 |
Вызов через делегат с оптимизациями | Min: 16 ms Max: 18 ms Mean: 16,2 ms Median: 16 ms Rel: 16 |
Min: 21 ms Max: 25 ms Mean: 22,15 ms Median: 22 ms Rel: 22 |
Min: 168 ms Max: 187 ms Mean: 172,8 ms Median: 170,5 ms Rel: 22.7 |
Min: 218 ms Max: 245 ms Mean: 228,8 ms Median: 227 ms Rel: 45.4 |
Вызов через dynamic | Min: 11 ms Max: 14 ms Mean: 11,5 ms Median: 11 ms Rel: 11 |
Min: 12 ms Max: 14 ms Mean: 12,5 ms Median: 12 ms Rel: 12 |
Min: 124 ms Max: 147 ms Mean: 132,1 ms Median: 130 ms Rel: 17 |
Min: 127 ms Max: 144 ms Mean: 131,5 ms Median: 129,5 ms Rel: 26 |
Вызов через Expression | Min: 4 ms Max: 4 ms Mean: 4 ms Median: 4 ms Rel: 4 |
Min: 4 ms Max: 5 ms Mean: 4,15 ms Median: 4 ms Rel: 4 |
Min: 46 ms Max: 55 ms Mean: 50 ms Median: 50,5 ms Rel: 6.7 |
Min: 47 ms Max: 51 ms Mean: 47,7 ms Median: 47 ms Rel: 9.4 |
List int
». Вопрос примитивной специализации дженериков лишь косвенно связан с затиранием, а польза от дженериков, видимых в ходе исполнения, сильно преувеличена молвой.