dynamic-property-lookup

Benchmark created by Mikko Rantanen on


Setup

var objs = [];
  for( var i = 0; i < 100000; i++ ) {
      objs.push( {
          name: "Object " + i,
          contact: {
              email: i + "@" + i.com,
              postalNumber: i
          }
      } );
  }
  
  var path = "contact.email";

Teardown



            // Write the combined length of e-mails.
  // Ensures the e-mails are used and validates result.
  console.log( result.reduce( ( c, n ) => c += n.length, 0 ) );
        
  

Test runner

Ready to run.

Testing in
TestOps/sec
Eval
var f = new Function( "o", "return o." + path );
var result = objs.map( f );
ready
Full dynamic
var getValue = function( obj, path ) {
    return path.split( "." ).reduce( ( curr, name ) => curr[ name ], obj );
}

var result = objs.map( o => getValue( o, path ) );
ready
Curried dynamic
var getFunc = function( path ) {
    var arr = path.split( "." )
    return ( obj ) => arr.reduce( ( curr, name ) => curr[ name ], obj );
}

var f = getFunc( path );
var result = objs.map( f );
ready
Curried dynamic non-reduce
var getFunc = function( path ) {
    var arr = path.split( "." )
    return ( obj ) => {
        var result = obj;
        for( var name of arr )
            result = result[ name ];
        return result;
    }
}

var f = getFunc( path );
var result = objs.map( f );
ready
Static
var result = objs.map( o => o.contact.email );
ready

Revisions

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

  • Revision 1: published by Mikko Rantanen on