<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
var data = _.range(100000).map(function(i) {
return {
counter: i
}
});
function isOdd(num) {
return num % 2 === 1;
}
function square(num) {
return num * num;
}
function lessThanThreeDigits(num) {
return num.toString().length < 3;
}
var result = data
.map(({counter}) => counter)
.filter(isOdd)
.map(square)
.filter(lessThanThreeDigits)
var transducer = R.compose (
R.map(R.prop('counter')),
R.filter(isOdd),
R.map(square),
R.filter(lessThanThreeDigits),
);
var result = R.transduce (
transducer,
(acc, val) => {
acc.push(val);
return acc;
},
[],
data,
);
var transducer = R.compose (
R.map(({counter}) => counter),
R.filter(isOdd),
R.map(square),
R.filter(lessThanThreeDigits),
);
var result = R.transduce (
transducer,
(acc, val) => {
acc.push(val);
return acc;
},
[],
data,
);
var result = R.pipe(
R.pluck('counter'),
R.filter(isOdd),
R.map(square),
R.filter(lessThanThreeDigits)
)(data);
var result = R.filter(lessThanThreeDigits,
R.map(square,
R.filter(isOdd,
R.pluck('counter', data))));
var result = R.pipe(
R.map (({counter}) => counter),
R.filter(isOdd),
R.map(square),
R.filter(lessThanThreeDigits)
)(data);
var result = _.chain(data)
.map('counter')
.filter(isOdd)
.map(square)
.filter(lessThanThreeDigits)
.value();
let result = [];
for (let i=0; i<data.length; i++) {
const { counter } = data[i];
if (isOdd (counter)) {
console.log ('t', counter);
let squared = square (counter);
if (lessThanThreeDigits (squared)) {
result.push (squared);
}
}
}
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
JS native | |
Ramda with transducer | |
Ramda with transducer (no prop) | |
Ramda with currying and composition | |
Ramda without relying on currying or composition | |
Ramda with currying and composition (no pluck) | |
Lodash | |
js native loops |
Test name | Executions per second |
---|---|
JS native | 187.7 Ops/sec |
Ramda with transducer | 65.4 Ops/sec |
Ramda with transducer (no prop) | 161.5 Ops/sec |
Ramda with currying and composition | 73.5 Ops/sec |
Ramda without relying on currying or composition | 99.0 Ops/sec |
Ramda with currying and composition (no pluck) | 186.3 Ops/sec |
Lodash | 174.7 Ops/sec |
js native loops | 3.9 Ops/sec |
Let's break down what is being tested in this benchmark.
Benchmark Definition: The benchmark compares the performance of four different approaches to achieve the same result:
filter
and map
methods to transform an array.Common operations:
The benchmark measures the execution speed of each approach, reported as executions per second (EPs/s), which is calculated by dividing the number of iterations completed in one second by the duration of the test.
Key observations:
Overall, this benchmark highlights the importance of choosing the right library or approach for a specific problem. In this case, Ramda's functional programming paradigm and curried functions seem to provide a good balance between performance and expressiveness.