Comments 5
Можно значительно улучшить производительность на чейнинге, если использовать lazy оператор. Скорость выполнения становится практически одинаковой.
let sum = fahrenheit
.lazy
.map({ (degreesFahrenheit) -> Double in
return (degreesFahrenheit - 32.0) / 1.8
})
.filter({ (degreesCelsius) -> Bool in
return degreesCelsius <= 20.0
})
.reduce(0.0) { (result, degreesCelsius) -> Double in
return result + degreesCelsius
}
Проверил тем же способом, только используя в 5 раз больше данных
let elementsCount = 50_000_000
let fahrenheit = Array(repeating: 0.0, count: elementsCount).map { _ -> Double in
return Double.random(in: 32.0 ... 113.0)
}
Запускал в релизной конфигурации с выключенным дебагом. Результат вот:
Chaining lazily average time = 9.5367431640625e-08
For-in average time = 3.5762786865234374e-08
Но с реактивщиной, конечно, да, всё грустно :)
Угу, потому что сравнили палец с другой известной частью тела. В реактивщине куча всего другого происходит просто потому, что она, блин, не для маппинга статических данных предназначена. Гениальное сравнение - берется фреймворк, у которого другое предназначение, находятся ключевые слова, делающие похожие вещи, а затем для чего-то сравнивается. А если бы элементы с разностью в секунду выдавались в реактивном потоке - то разница уже в тысячи бы раз была, да?
Интересно было бы сравнить результаты на другом количестве элементов в массивах, вангую что цифры могут удивить)
Очень странное в примере «Цепочка (map+filter+reduce)» сравнение. Во-первых все что делается в цепочки можно сделать в reduce. Во вторых почему for in один, а не на каждую операцию ?
Производительность встроенных функций высшего порядка в сравнении с циклом for-in в Swift