Skip to content

Possible performance tuning. #1

@Raynos

Description

@Raynos

I replaced two lines in my code base from:

var copy = JSON.parse(JSON.stringify(o))

to

var copy = universalCopy(o)

And it increased the runtime of test suite from 4 seconds to 5 seconds.

My code base is a type checker, the main place i use universalCopy() is to copy the type definition files AST, which is a large data structure.

JSON.parse(JSON.stringify()):

$ time node test/index.js | grep -v '^ok' | grep -v '^# '
pid: 28829
TAP version 13
1..12275

real    0m16.841s
user    0m16.800s
sys 0m0.256s

universal-copy:

$ time node test/index.js | grep -v '^ok' | grep -v '^# '
pid: 28711
TAP version 13
1..12275

real    0m31.591s
user    0m31.464s
sys 0m0.420s

I also created two flamegraphs:

Image of unversal-copy

  • Looking at the wallclock time, in this stress test the performance was 50%
  • in my actual test-suite the performance dropped by 20%.
  • Looking at the flamegraph in detail, JSON.stringify/JSON.parse is 800% faster in isolation.

Also, from these flames, it looks like the other huge CPU hog is my naively implemented language parser using the parsimmon framework :)

It would be cool if benchmarks can be added and this library can be performance tuned.

Once I start performance tuning my application, I can optimize the copy() function and contribute the code back (it might make simplification trade-offs for performance... and no longer be "universal")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions