Script Preparation code:
x
 
const data = ["hello", " ", "world", "!"];
var dep1 = { id: 0 };
var dep2 = { id: 1 };
var dep3 = { id: 2 };
var dep4 = { id: 3 };
var deps1 = [dep1];
var deps2 = [dep1, dep2];
var deps3 = [dep1, dep2, dep3];
var deps4 = [dep1, dep2, dep3, dep4];
function sample1(_0) {
  return _0;
}
function sample2(_0, _1) {
  return _0 + _1;
}
function sample3(_0, _1, _2) {
  return _0 + _1 + _2;
}
function sample4(_0, _1, _2, _3) {
  return _0 + _1 + _2 + _3;
}
var sampleApply1 = createApplyComputation(sample1, deps1);
var sampleApply2 = createApplyComputation(sample2, deps2);
var sampleApply3 = createApplyComputation(sample3, deps3);
var sampleApply4 = createApplyComputation(sample4, deps4);
var sampleSingle1 = createSingleComputation(sample1, dep1, true);
var sampleSingle2 = createSingleComputation(sample2, deps2);
var sampleSingle3 = createSingleComputation(sample3, deps3);
var sampleSingle4 = createSingleComputation(sample4, deps4);
var sampleDeopt1 = createDeoptComputation(sample1, deps1);
var sampleDeopt2 = createDeoptComputation(sample2, deps2);
var sampleDeopt3 = createDeoptComputation(sample3, deps3);
var sampleDeopt4 = createDeoptComputation(sample4, deps4);
function createDeoptComputation(fn, deps) {
  return () => fn(...deps.map(read));
}
function createApplyComputation(fn, deps) {
  switch (deps.length) {
    case 1:
      return () => fn(read(deps[0]));
    case 2:
      return () => fn(read(deps[0]), read(deps[1]));
    case 3:
      return () => fn(read(deps[0]), read(deps[1]), read(deps[2]));
    default:
      return () => fn(...deps.map(read));
  }
}
function createSingleComputation(fn, deps, isSingle) {
  if (isSingle) {
    return () => fn(read(deps));
  } else {
    return () => fn(...deps.map(read));
  }
}
function read(s) {
  return data[s.id];
}
Tests:
  • apply exec 1

     
    sampleApply1();
  • deopt create 2

     
    createDeoptComputation(sample2, [dep1, dep2])();
  • deopt create 1

     
    createDeoptComputation(sample1, [dep1])();
  • deopt exec 4

     
    sampleDeopt4();
  • deopt exec 3

     
    sampleDeopt3();
  • deopt exec 2

     
    sampleDeopt2();
  • deopt exec 1

     
    sampleDeopt1();
  • single create 4

     
    createSingleComputation(sample4, [dep1, dep2, dep3, dep4])();
  • single create 3

     
    createSingleComputation(sample3, [dep1, dep2, dep3])();
  • single create 2

     
    createSingleComputation(sample2, [dep1, dep2])();
  • single create 1

     
    createSingleComputation(sample1, dep1, true)();
  • apply create 4

     
    createApplyComputation(sample4, [dep1, dep2, dep3, dep4])();
  • apply create 3

     
    createApplyComputation(sample3, [dep1, dep2, dep3])();
  • apply create 2

     
    createApplyComputation(sample2, [dep1, dep2])();
  • apply create 1

     
    createApplyComputation(sample1, [dep1])();
  • single exec 4

     
    sampleSingle4();
  • single exec 3

     
    sampleSingle3();
  • single exec 2

     
    sampleSingle2();
  • single exec 1

     
    sampleSingle1();
  • apply exec 4

     
    sampleApply4();
  • apply exec 3

     
    sampleApply3();
  • apply exec 2

     
    sampleApply2();
  • deopt create 3

     
    createDeoptComputation(sample3, [dep1, dep2, dep3])();
  • deopt create 4

     
    createDeoptComputation(sample4, [dep1, dep2, dep3, dep4])();
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    apply exec 1
    deopt create 2
    deopt create 1
    deopt exec 4
    deopt exec 3
    deopt exec 2
    deopt exec 1
    single create 4
    single create 3
    single create 2
    single create 1
    apply create 4
    apply create 3
    apply create 2
    apply create 1
    single exec 4
    single exec 3
    single exec 2
    single exec 1
    apply exec 4
    apply exec 3
    apply exec 2
    deopt create 3
    deopt create 4

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 4 years ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36
Chrome 86 on Windows
View result in a separate tab
Test name Executions per second
apply exec 1 1504702.4 Ops/sec
apply exec 2 910264.9 Ops/sec
apply exec 3 602473.1 Ops/sec
apply exec 4 548005.2 Ops/sec
single exec 1 1359130.5 Ops/sec
single exec 2 713670.4 Ops/sec
single exec 3 863368.8 Ops/sec
single exec 4 859905.2 Ops/sec
apply create 1 535314.0 Ops/sec
apply create 2 417749.9 Ops/sec
apply create 3 344273.7 Ops/sec
apply create 4 319084.2 Ops/sec
single create 1 681042.9 Ops/sec
single create 2 426836.6 Ops/sec
single create 3 308875.1 Ops/sec
single create 4 236617.7 Ops/sec
deopt exec 1 873071.6 Ops/sec
deopt exec 2 857551.8 Ops/sec
deopt exec 3 648210.4 Ops/sec
deopt exec 4 466000.8 Ops/sec
deopt create 1 634817.8 Ops/sec
deopt create 2 393599.9 Ops/sec
deopt create 3 345296.4 Ops/sec
deopt create 4 288805.6 Ops/sec