brianc / node-postgres

PostgreSQL client for node.js.
https://node-postgres.com
MIT License
12.04k stars 1.21k forks source link

perf: pre allocate array instead of push item #3250

Open nigrosimone opened 3 weeks ago

nigrosimone commented 3 weeks ago

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

charmander commented 3 weeks ago

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

nigrosimone commented 3 weeks ago

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

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

charmander commented 3 weeks ago

20% faster on what benchmark?

nigrosimone commented 3 weeks ago

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 commented 3 weeks ago

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

nigrosimone commented 3 weeks ago

@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