From de0b61393c884aa1729b71e9d3a720dc35323c85 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 14 Sep 2015 10:41:59 +0200 Subject: [PATCH] Minimize allocations --- src/line-numbers-tile-component.coffee | 26 +++++++++----------------- src/lines-tile-component.coffee | 25 ++++++++++--------------- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/line-numbers-tile-component.coffee b/src/line-numbers-tile-component.coffee index 330779999..f00c968fc 100644 --- a/src/line-numbers-tile-component.coffee +++ b/src/line-numbers-tile-component.coffee @@ -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) diff --git a/src/lines-tile-component.coffee b/src/lines-tile-component.coffee index 66aacf569..7f6de6397 100644 --- a/src/lines-tile-component.coffee +++ b/src/lines-tile-component.coffee @@ -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)