Uh oh!
There was an error while loading. Please reload this page.
buffer: inspect extra properties - #25150
Conversation
FWIW Here's what I came up with for the JS implementation: functionisAllDigits(s){if(s.length===0)returnfalse;for(vari=0;i<s.length;++i){constcode=s.charCodeAt(i);if(code<48||code>57)returnfalse;}returntrue;}functiongetOwnNonIndexProperties(obj,filter){constprops=[];varp=0;if(filter===ONLY_ENUMERABLE){constkeys=Object.keys(obj);for(vari=0;i<keys.length;++i){constkey=keys[i];if(!isAllDigits(key))props[p++]=key;}}else{// TODO or defer to C++ implementation}returnprops;}It's at least twice as fast for a variety of objects using node master. |
BridgeAR
commented
Dec 20, 2018
@mscdex how would that look like? I can't think of any way to access the keys like that in JS. The functions returns the keys of an object that are not numbers (keys are sorted by spec. First the numbers, then strings, then symbols). |
mscdex
commented
Dec 20, 2018
@BridgeAR I updated my comment with the implementation I benchmarked with. |
BridgeAR
commented
Dec 20, 2018
@mscdex that will be very slow for objects with lots of properties. The reason is that the array with all keys has to be allocated first and that would be very expensive. |
mscdex
commented
Dec 20, 2018
@BridgeAR How many properties are we talking about here? |
BridgeAR
commented
Dec 20, 2018
@mscdex in my direct comparison I can't get the JS function to be faster under any circumstances. The C++ function has a constant time while the JS function is over linear and even for small buffers, the C++ function wins when running it multiple times. |
@BridgeAR FWIW here is the complete benchmark code I used (comment out the case not being tested): Benchmark codeconstn=1e6;constvals=[{foo: 'bar',baz: 5,quux: true},{'1': 'bar','2': 5,'3': 5.1},{'-1': 'bar','2': 5,'3a': 40000},{'': ()=>{},'1234567890-0987654321': false,quux: false}];const{propertyFilter: {ALL_PROPERTIES,ONLY_ENUMERABLE}}=process.binding('util');constfilter=ONLY_ENUMERABLE;varname;// Case #1//~ const {//~ getOwnNonIndexProperties,//~} = process.binding('util');//~ name = 'C++';// Case #2functionisAllDigits(s){if(s.length===0)returnfalse;for(vari=0;i<s.length;++i){constcode=s.charCodeAt(i);if(code<48||code>57)returnfalse;}returntrue;}functiongetOwnNonIndexProperties(obj,filter){constprops=[];varp=0;if(filter===ONLY_ENUMERABLE){constkeys=Object.keys(obj);for(vari=0;i<keys.length;++i){constkey=keys[i];if(!isAllDigits(key))props[p++]=key;}}else{}returnprops;}name='JS';// Run the benchmarkconsole.time(name);for(vari=0;i<n;++i){for(varj=0;j<vals.length;++j)getOwnNonIndexProperties(vals[j],filter);}console.timeEnd(name);Running this I get ~1100ms for C++ and ~510ms for JS on node master. EDIT: For mostly numeric keys the C++ implementation does seem to be a little faster, but not by a whole lot (~50ms), when using objects with the same number of properties as in the cases provided above. |
@mscdex this function is used for array types (in this case Buffer / Uint8Array), not for regular objects. |
BridgeAR
commented
Dec 23, 2018
CI https://ci.nodejs.org/job/node-test-pull-request/19763/ @nodejs/buffer @nodejs/util PTAL |
Resume Build CI: https://ci.nodejs.org/job/node-test-pull-request/19767/ ✔️ |
This makes sure extra properties on buffers are not ignored anymore when inspecting the buffer.
60a5f3d to
1be4412CompareRebased due to conflicts. CI https://ci.nodejs.org/job/node-test-pull-request/19787/ ✔️ |
BridgeAR
commented
Dec 27, 2018
@nodejs/buffer @nodejs/util PTAL. This needs another review. |
This makes sure extra properties on buffers are not ignored anymore when inspecting the buffer. PR-URL: nodejs#25150 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
BridgeAR
commented
Dec 27, 2018
Landed in d385e2c 🎉 |
addaleax
commented
Jan 5, 2019
Should this be backported to |
This makes sure extra properties on buffers are not ignored anymore when inspecting the buffer. PR-URL: nodejs#25150 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This makes sure extra properties on buffers are not ignored anymore when inspecting the buffer. PR-URL: #25150 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This makes sure extra properties on buffers are not ignored anymore when inspecting the buffer. PR-URL: #25150 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This makes sure extra properties on buffers are not ignored anymore when inspecting the buffer. PR-URL: nodejs#25150 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This makes sure extra properties on buffers are not ignored anymore when inspecting the buffer. PR-URL: nodejs#25150 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This makes sure extra properties on buffers are not ignored anymore
when inspecting the buffer.
I am not sure about this either being a patch or semver-major. We mainly consider changes to
util.inspectas patch, so I guess this could be considered a similar thing.The implementation uses some internal knowledge and it would require more overhead otherwise but this seemed the most straight forward way to do this.
Checklist
make -j4 test(UNIX), orvcbuild test(Windows) passes