Pull to refresh

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 один, а не на каждую операцию ?

Sign up to leave a comment.

Articles