create.js 2.04 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ----------------------------------------------------------------------------

function shallowClone(object) {
  return Object.create(object.__proto__,
      Object.getOwnPropertyDescriptors(object));
}

function makeSlowCopy(object) {
  object = shallowClone(object);
  object.__foo__ = 1;
  delete object.__foo__;
  return object;
}

function convertToPropertyDescriptors(dict) {
  for (var key in dict) {
    var propertiesObject = dict[key];
    dict[key] = Object.getOwnPropertyDescriptors(propertiesObject);
  }
  return dict;
}

var properties_5 = { a:1, b:2, c:3, d:4, e:5 };
var TEST_PROPERTIES = convertToPropertyDescriptors({
  empty: {},
  array_5: [1, 2, 3, 4, 5],
  properties_5: properties_5,
  properties_10: { a:1, b:2, c:3, d:4, e:5, f:6, g:7, h:8, i:9, j:10 },
  properties_dict: makeSlowCopy(properties_5)
});

var TEST_PROTOTYPES = {
  null: null,
  empty: {},
  'Object.prototype': Object.prototype,
  'Array.prototype': Array.prototype
};

// ----------------------------------------------------------------------------

var testFunction = () => {
  return Object.create(prototype, properties);
}

function createTestFunction(prototype, properties) {
  // Force a new function for each test-object to avoid side-effects due to ICs.
  var random_comment = "\n// random comment" + Math.random() + "\n";
  return eval(random_comment + testFunction.toString());
}

// ----------------------------------------------------------------------------

var benchmarks = []

for (var proto_name in TEST_PROTOTYPES) {
  var prototype = TEST_PROTOTYPES[proto_name];
  for (var prop_name in TEST_PROPERTIES) {
    var properties = TEST_PROPERTIES[prop_name];
    var name = 'Create proto:' + proto_name + " properties:" + prop_name;
    benchmarks.push(
        new Benchmark(name, false, false, 0,
          createTestFunction(prototype, properties)));
  }
}

new BenchmarkSuite('Create', [1000], benchmarks);