Plain JS vs Immutable vs mori (v16)

Revision 16 of this benchmark created by John Michel on


Preparation HTML

<script src="http://s3-eu-west-1.amazonaws.com/kosstest/commits.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/immutable/3.6.2/immutable.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/mori/0.3.2/mori.js"></script>

Setup

window.immutableCommits = Immutable.fromJS(commitsOrigin);
    window.moriCommits = mori.toClj(commitsOrigin);

Test runner

Ready to run.

Testing in
TestOps/sec
Plain JS
// 1. Group by authors
var groupedByAuthors = {};
commitsOrigin.forEach(function(c) {
  var email = c.commit.author.email;
  (groupedByAuthors[email] || (groupedByAuthors[email] = [])).push(c);
});

// 2. Sort by authors (asc)
var sortedAuthors = Object.keys(groupedByAuthors).sort();
var result = {};
sortedAuthors.forEach(function(author) {

  // 3. Group by hours
  var groupedByHours = {};
  groupedByAuthors[author].forEach(function(c) {
    var date = new Date(c.commit.author.date);
    date.setMinutes(0);
    var hour = date.toISOString();
    (groupedByHours[hour] || (groupedByHours[hour] = [])).push(c);
  });

  // 4. Sort by hours (desc)
  var sortedHours = Object.keys(groupedByHours).sort().reverse();
  var groupedAndSortedByHours = {};
  sortedHours.forEach(function(hour) {
    var commits = [];
    groupedByHours[hour].forEach(function(c) {
      commits.push(c);
    })

    // 5. Sort by time (desc)
    var sortedByTime = commits.sort(function(a, b) {
      return a.commit.author.date > a.commit.author.date ? -1 : 1;
    });

    groupedAndSortedByHours[hour] = sortedByTime;
  });

  result[author] = groupedAndSortedByHours;
});
ready
Immutable
var commits = immutableCommits;

// 1. Group by authors
var groupedByAuthors = commits.groupBy(function(c) {
  return c.getIn(['commit', 'author', 'email']);
});

// 2. Sort by authors (asc)
var sortedAuthors = groupedByAuthors.keySeq().sort();
var result = sortedAuthors.reduce(function(acc, author) {

  // 3. Group by hours
  var groupedByHours = groupedByAuthors.get(author).groupBy(function(c) {
    var date = new Date(c.getIn(['commit', 'author', 'date']));
    date.setMinutes(0);
    return date.toISOString();
  });

  // 4. Sort by hours (desc)
  var sortedHours = groupedByHours.keySeq().sort().reverse();
  var groupedAndSortedByHours = sortedHours.reduce(function(acc, hour) {
    var commits = groupedByHours.get(hour);

    // 5. Sort by time (desc)
    var sortedByTime = commits.sortBy(function(c) {
      return c.getIn(['commit', 'author', 'date']);
    }).reverse();

    return acc.set(hour, sortedByTime);
  }, Immutable.OrderedMap());

  return acc.set(author, groupedAndSortedByHours);
}, Immutable.OrderedMap());

var resultInJS = result.toJS();
ready
mori
// 1. Group by authors
var groupedByAuthors = mori.groupBy(function(c) {
  return mori.getIn(c, ['commit', 'author', 'email']);
}, moriCommits);

// 2. Sort by authors (asc)
var sortedAuthors = mori.sort(mori.keys(groupedByAuthors));
var result = mori.reduce(function(acc, author) {

  // 3. Group by hours
  var groupedByHours = mori.groupBy(function(c) {
    var date = new Date(mori.getIn(c, ['commit', 'author', 'date']));
    date.setMinutes(0);
    return date.toISOString();
  }, mori.get(groupedByAuthors, author));

  // 4. Sort by hours (desc)

  var sortedHours = mori.reverse(mori.sort(mori.keys(groupedByHours)));
  var groupedAndSortedByHours = mori.reduce(function(acc, hour) {
    var commits = mori.get(groupedByHours, hour);

    // 5. Sort by time (desc)
    var sortedByTime = mori.reverse(mori.sortBy(function(c) {
      return mori.getIn(c, ['commit', 'author', 'date']);
    }, commits));

    return mori.conj(acc, mori.vector(hour, sortedByTime))
  }, mori.vector(), sortedHours);

  return mori.conj(acc, mori.vector(author, groupedAndSortedByHours));
}, mori.vector(), sortedAuthors);

var resultInJS = mori.toJs(result);
ready

Revisions

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