node-postgres icon indicating copy to clipboard operation
node-postgres copied to clipboard

perf: pre allocate array instead of push item

Open nigrosimone opened this issue 1 year ago • 6 comments

just a little performance improvement. Preallocating array instead of push item

nigrosimone avatar Jun 06 '24 14:06 nigrosimone

Thanks for bringing this up. Do you have any benchmark results?

charmander avatar Jun 07 '24 03:06 charmander

Thanks for bringing this up. Do you have any benchmark results?

The PR is 20% faster. Tested only on node 20.

nigrosimone avatar Jun 08 '24 00:06 nigrosimone

20% faster on what benchmark?

charmander avatar Jun 08 '24 00:06 charmander

20% faster on what benchmark?

I have made a benchmark of single method, but moking the db/query logic, just for test if Preallocating array has a performance benefit, eg consumeFields

nigrosimone avatar Jun 08 '24 00:06 nigrosimone

pre allocate array is generally faster compared to other methods, push is the slower benchmark

nigrosimone avatar Jun 08 '24 13:06 nigrosimone

@charmander after fixed dev container with https://github.com/brianc/node-postgres/pull/3251 I have also run the pg-native bench https://github.com/brianc/node-postgres/blob/master/packages/pg-native/bench/index.js

TL;TR

The benchmark shows no improvement. But looking at the benchmark code, this doesn't appear to be very accurate

PR

node index.js

pure done 49
native done 36
pure done 70
native done 36
pure done 51
native done 43
pure done 25
native done 38
pure done 20
native done 27
pure done 35
native done 29
pure done 34
native done 54
pure done 33
native done 58
pure done 55
native done 24
pure done 31
native done 38
pure done 25
native done 25
pure done 19
native done 29
pure done 32
native done 36
pure done 54
native done 46

MASTER

node index.js

pure done 73
native done 60
pure done 29
native done 44
pure done 15
native done 33
pure done 44
native done 29
pure done 15
native done 47
pure done 15
native done 50
pure done 15
native done 30
pure done 15
native done 37
pure done 16
native done 17
pure done 23
native done 36
pure done 43
native done 35
pure done 17
native done 19
pure done 17
native done 39
pure done 15
native done 45
pure done 15
native done 31
pure done 39
native done 27
pure done 16
native done 39

nigrosimone avatar Jun 08 '24 19:06 nigrosimone

Hi @charmander also on the vanilla "result object" the array length is pre allocate, why not on native? https://github.com/brianc/node-postgres/blob/master/packages/pg/lib/result.js#L51

This PR just align the behaviour.

Side note: Side note: preallocate and fill is better, eg.:

const size = 1_000;
const arr = new Array(size).fill(null); 
for(let i = 0; i<size; i++){
   arr[i] = {foo: "foo"};
}

see benchmark

cesco69 avatar Oct 29 '24 13:10 cesco69