Alasql vs Linq on GroupBy

Benchmark created by agershun on


Description

Stackoverflow question:

What is the most efficient method to groupby on a javascript array of objects?

http://stackoverflow.com/questions/14446511/what-is-the-most-efficient-method-to-groupby-on-a-javascript-array-of-objects?lq=1

Tests are running on 2^20 records (about 1000000 records).

Preparation HTML

<script src="http://alasql.org/console/alasql.min.js"></script>
<script src="http://neue.cc/linq.min.js"></script>

Setup

var data = [{
      Phase: "Phase 1",
      Step: "Step 1",
      Task: "Task 1",
      Value: "5"
    }, {
      Phase: "Phase 1",
      Step: "Step 1",
      Task: "Task 2",
      Value: "10"
    }, {
      Phase: "Phase 1",
      Step: "Step 2",
      Task: "Task 1",
      Value: "15"
    }, {
      Phase: "Phase 1",
      Step: "Step 2",
      Task: "Task 2",
      Value: "20"
    }, {
      Phase: "Phase 2",
      Step: "Step 1",
      Task: "Task 1",
      Value: "25"
    }, {
      Phase: "Phase 2",
      Step: "Step 1",
      Task: "Task 2",
      Value: "30"
    }, {
      Phase: "Phase 2",
      Step: "Step 2",
      Task: "Task 1",
      Value: "35"
    }, {
      Phase: "Phase 2",
      Step: "Step 2",
      Task: "Task 2",
      Value: "40"
    }];
    for (var i = 0; i < 17; i++) {
      data = data.concat(data);
    }

Test runner

Ready to run.

Testing in
TestOps/sec
Alasql (with compilation)
var res = alasql('SELECT Phase, SUM(CAST([Value] AS INT)) AS [Value] FROM ? GROUP BY Phase', [data]);
ready
Alasql (without compilation)
alasql.databases.alasql.resetSqlCache();
var res = alasql('SELECT Phase, SUM(CAST([Value] AS INT)) AS [Value] FROM ? GROUP BY Phase', [data]);
ready
Lnq
var linq = Enumerable.From(data);
var result =
  linq.GroupBy(function(x) {
    return x.Phase;
  })
  .Select(function(x) {
    return {
      Phase: x.Key(),
      Value: x.Sum(function(y) {
        return y.Value | 0;
      })
    };
  })
  .ToArray();
ready

Revisions

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

  • Revision 1: published by agershun on
  • Revision 2: published by mathiasrw on
  • Revision 3: published by mathiasrw on