Sort vs reduce

Benchmark created on


Setup

const WeightUnitMultiplier = {
  mg: 1,
  g: 1_000,
  kg: 1_000_000,
  t: 1_000_000_000,
  oz: 28_349.5231,
  lb: 453_592.37,
};

const weights = [
  { milligrams: 1000, displayUnit: 'mg' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'mg' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'mg' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'mg' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'mg' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'mg' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'g' },
  { milligrams: 1000, displayUnit: 'kg' },
  { milligrams: 1000, displayUnit: 'kg' },
];

function sumWeightsInMilligrams1(weights) {
  const sortedUnits = Object.values(WeightUnit).sort((a, b) => WeightUnitMultiplier[a] - WeightUnitMultiplier[b]);
  let largestUnitIndex = 0;
  let totalWeightInMg = 0;

  weights.forEach((weight) => {
    totalWeightInMg += weight.milligrams;
    largestUnitIndex = Math.max(largestUnitIndex, sortedUnits.indexOf(weight.displayUnit));
  });

  return {
    weightInMg: totalWeightInMg,
    largestDisplayUnit: sortedUnits[largestUnitIndex],
  };
}

function sumWeightsInMilligrams2(weights) {
return {
    weightInMg: weights.map((it) => it.milligrams).reduce((a, b) => a + b),
    largestDisplayUnit: weights
      .map((it) => ({
        unit: it.displayUnit,
        multiplier: WeightUnitMultiplier[it.displayUnit],
      }))
      .reduce((a, b) => (a.multiplier > b.multiplier ? a : b)).unit,
  };
}


Test runner

Ready to run.

Testing in
TestOps/sec
Sort
sumWeightsInMilligrams1(weights)
ready
Reduce
sumWeightsInMilligrams1(weights)
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.