Thanks for the quick feedback!

I rewrote the JS version to be closer to the native one:

var array = [];
var input = {
  "_id": {
    "$oid": "5a00bad8f759511811e030ba"
  },
  "attributes": [
    {
      "key": "smartshape.scene.node.path|default",
      "value": "/scene/Lot444.scene",
      "type": "imported"
    },
    {
      "key": "max x",
      "value": 196.5773162841797,
      "type": "computed"
    },
    {
      "key": "max y",
      "value": 18.55002021789551,
      "type": "computed"
    },
    {
      "key": "max z",
      "value": 22.87815856933594,
      "type": "computed"
    },
    {
      "key": "min x",
      "value": 149.9346771240234,
      "type": "computed"
    },
    {
      "key": "min y",
      "value": 18.54999732971191,
      "type": "computed"
    },
    {
      "key": "min z",
      "value": -23.35353088378906,
      "type": "computed"
    },
    {
      "key": "box radius",
      "value": 23.32131958007814,
      "type": "computed"
    },
    {
      "key": "center x",
      "value": 173.25599670410156,
      "type": "computed"
    },
    {
      "key": "center y",
      "value": 18.55000877380371,
      "type": "computed"
    },
    {
      "key": "center z",
      "value": -0.23768615722655895,
      "type": "computed"
    },
    {
      "key": "width",
      "value": 46.64263916015628,
      "type": "computed"
    },
    {
      "key": "height",
      "value": 2.2888183600855427e-05,
      "type": "computed"
    },
    {
      "key": "depth",
      "value": 46.231689453125,
      "type": "computed"
    },
    {
      "key": "box volume",
      "value": 0.04935534689932106,
      "type": "computed"
    },
    {
      "key": "box surface",
      "value": 4312.740269302394,
      "type": "computed"
    }
  ],
  "name": "default1161",
  "uuid": "70bf7d72-1fa9-5c8f-21ff-03ef209d4404",
  "surfaces": [
    "6f5201a2-31a7-14d0-6b2a-5130007d2a51"
  ],
  "aabb": [
    196.5773162841797,
    18.55002021789551,
    22.87815856933594,
    149.9346771240234,
    18.54999732971191,
    -23.35353088378906
  ],
  "position": null,
  "scale": null,
  "rotation": null,
  "parents": [
    "18497b66-3f32-6e98-1899-2998203e6397",
    null
  ],
  "file": "5a00b9a4aa5d2517d32d03da",
  "numChildren": 0,
  "sceneTreeIndices": [
    0
  ]
};

function process(value) {
  if (typeof value === "number") {
    return value;
  } else if (typeof value === "string") {
    return value;
  } else if (Array.isArray(value)) {
    var array = [];

    for (var item of value) {
      array.push(process(item));
    }

    return array;
  } else if (typeof value === "object") {

    if (!value) {
      return value;
    }

    var obj = {};
    for (var key of Object.keys(value)) {
      obj[key] = process(value[key]);
    }

    return obj;
  } else {
    return value;
  }

  return value;
}

for (var i = 0; i < 26000; ++i) {
  var obj = process(input);

  array.push(obj);
}



Now it takes *30ms. That's still 5x faster* than the native code.

I'm suspecting my Local<Object> are copied/GCed multiple time to build the 
final object.
Isn't that the case?
Is there a better way to do it?

using a constructor function and just filling in the values should be 
> faster than assembling them one property at a time.


The root object is expected to be the same 99% of the time.
Each of his field too.
So I could definitely have a map<key, function>.
How can I implement such a constructor function in v8 ?

Thanks !

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to