Skip to content

Performance regression in 4.x with objects paired with delete #3538

Closed
@mhart

Description

This spun out from exploring isaacs/node-lru-cache#54

It may very well be a v8 issue, but I haven't been able to find the right circumstances to reproduce due to v8's lack of setImmediate

When running the following program in 4.x (on Linux or Mac), there's a huge slowdown around iteration 92000 that does not occur in 3.x or below:

var lruCache = Object.create(null)
var i = 0
var last = Date.now()
var max = 4097 // lowering to 4096 fixes the problem

function next() {
  lruCache[i] = true
  if (i >= max) delete lruCache[i - max]

  i++

  if (i > 200000) return

  if ((i % 2000) === 0) {
    var now = Date.now()
    console.log({
      duration: now - last,
      iteration: i,
    })
    last = now
  }

  setImmediate(next)
}

next()

So in 4.x the output looks like:

$ node test.js
{ duration: 6, iteration: 2000 }
{ duration: 22, iteration: 4000 }
{ duration: 6, iteration: 6000 }
{ duration: 4, iteration: 8000 }
{ duration: 3, iteration: 10000 }
...
{ duration: 5, iteration: 90000 }
{ duration: 3, iteration: 92000 }
{ duration: 4870, iteration: 94000 }
{ duration: 5151, iteration: 96000 }
{ duration: 5336, iteration: 98000 }
{ duration: 782, iteration: 100000 }
{ duration: 7, iteration: 102000 }
{ duration: 5, iteration: 104000 }
...
{ duration: 8, iteration: 200000 }

Using 3.3.1 or lowering max to 4096 looks like:

{ duration: 7, iteration: 2000 }
{ duration: 18, iteration: 4000 }
{ duration: 9, iteration: 6000 }
...
{ duration: 7, iteration: 90000 }
{ duration: 6, iteration: 92000 }
{ duration: 6, iteration: 94000 }
{ duration: 7, iteration: 96000 }
...
{ duration: 5, iteration: 198000 }
{ duration: 9, iteration: 200000 }

I'm 85% sure this is the same issue, or at least very similar to the one that's exhibited in isaacs/node-lru-cache#54 – just as a more refined reproduction. The main difference is in the lru-cache issue it doesn't seem to ever speed up again (some sort of reoptimization?).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions