Minimize allocations

This commit is contained in:
Antonio Scandurra
2015-09-14 10:41:59 +02:00
parent 326a035835
commit de0b61393c
2 changed files with 19 additions and 32 deletions

View File

@@ -8,7 +8,6 @@ class LineNumbersTileComponent
constructor: ({@id}) ->
@lineNumberNodesById = {}
@lineNumberIdsByScreenRow = {}
@domNode = document.createElement("div")
@domNode.style.position = "absolute"
@domNode.style.display = "block"
@@ -63,7 +62,6 @@ class LineNumbersTileComponent
unless @newTileState.lineNumbers.hasOwnProperty(id)
@lineNumberNodesById[id].remove()
delete @lineNumberNodesById[id]
delete @lineNumberIdsByScreenRow[lineNumberState.screenRow]
delete @oldTileState.lineNumbers[id]
for id, lineNumberState of @newTileState.lineNumbers
@@ -74,30 +72,24 @@ class LineNumbersTileComponent
newLineNumbersHTML ?= ""
newLineNumberIds.push(id)
newLineNumbersHTML += @buildLineNumberHTML(lineNumberState)
@lineNumberIdsByScreenRow[lineNumberState.screenRow] = id
@oldTileState.lineNumbers[id] = _.clone(lineNumberState)
return unless newLineNumberIds?
WrapperDiv.innerHTML = newLineNumbersHTML
newLineNumberNodes = _.toArray(WrapperDiv.children)
@insertNodes(newLineNumberNodes)
insertNodes: (lineNumberNodes) ->
lineNumberNodes = _.sortBy(lineNumberNodes, @screenRowForNode)
while newNode = lineNumberNodes.shift()
id = @lineNumberIdsByScreenRow[newNode.dataset.screenRow]
domNodes = _.toArray(@domNode.children)
while nextNode = domNodes.shift()
break if @screenRowForNode(newNode) < @screenRowForNode(nextNode)
if nextNode?
@domNode.insertBefore(newNode, nextNode)
for id, i in newLineNumberIds
lineNumberNode = newLineNumberNodes[i]
@lineNumberNodesById[id] = lineNumberNode
if nextNode = @findNodeNextTo(lineNumberNode)
@domNode.insertBefore(lineNumberNode, nextNode)
else
@domNode.appendChild(newNode)
@domNode.appendChild(lineNumberNode)
@lineNumberNodesById[id] = newNode
findNodeNextTo: (node) ->
for nextNode in @domNode.children
return nextNode if @screenRowForNode(node) < @screenRowForNode(nextNode)
return
screenRowForNode: (node) -> parseInt(node.dataset.screenRow)

View File

@@ -106,23 +106,18 @@ class LinesTileComponent
WrapperDiv.innerHTML = newLinesHTML
newLineNodes = _.toArray(WrapperDiv.children)
@insertLineNodes(newLineNodes)
insertLineNodes: (lineNodes) ->
lineNodes = _.sortBy(lineNodes, @screenRowForNode)
while newNode = lineNodes.shift()
id = @lineIdsByScreenRow[newNode.dataset.screenRow]
domNodes = _.rest(@domNode.children) # skips highlights node
while nextNode = domNodes.shift()
break if @screenRowForNode(newNode) < @screenRowForNode(nextNode)
if nextNode?
@domNode.insertBefore(newNode, nextNode)
for id, i in newLineIds
lineNode = newLineNodes[i]
@lineNodesByLineId[id] = lineNode
if nextNode = @findNodeNextTo(lineNode)
@domNode.insertBefore(lineNode, nextNode)
else
@domNode.appendChild(newNode)
@domNode.appendChild(lineNode)
@lineNodesByLineId[id] = newNode
findNodeNextTo: (node) ->
for nextNode, index in @domNode.children
continue if index is 0 # skips highlights node
return nextNode if @screenRowForNode(node) < @screenRowForNode(nextNode)
return
screenRowForNode: (node) -> parseInt(node.dataset.screenRow)