Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 890862f

Browse files
author
Antonio Scandurra
committed
Make MarkerLayer.prototype.getMarkerCount() faster
1 parent 1fffd5c commit 890862f

File tree

1 file changed

+31
-24
lines changed

1 file changed

+31
-24
lines changed

src/marker-layer.coffee

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ class MarkerLayer
3737
@persistent = options?.persistent ? false
3838
@emitter = new Emitter
3939
@index = new MarkerIndex
40-
@markersById = {}
40+
@markersById = new Map
41+
@markers = []
4142
@markersIdsWithChangeSubscriptions = new Set
4243
@createdMarkers = new Set
4344
@destroyedMarkers = new Set
@@ -51,7 +52,7 @@ class MarkerLayer
5152
# locations.
5253
copy: ->
5354
copy = @delegate.addMarkerLayer({@maintainHistory})
54-
for markerId, marker of @markersById
55+
@markersById.forEach (marker, id) =>
5556
snapshot = marker.getSnapshot(null)
5657
copy.createMarker(marker.getRange(), marker.getSnapshot())
5758
copy
@@ -78,19 +79,21 @@ class MarkerLayer
7879
#
7980
# Returns a {Marker}.
8081
getMarker: (id) ->
81-
@markersById[id]
82+
@markersById.get(id)
8283

8384
# Public: Get all existing markers on the marker layer.
8485
#
8586
# Returns an {Array} of {Marker}s.
8687
getMarkers: ->
87-
marker for id, marker of @markersById
88+
markers = []
89+
@markersById.forEach (marker) -> markers.push(marker)
90+
markers
8891

8992
# Public: Get the number of markers in the marker layer.
9093
#
9194
# Returns a {Number}.
9295
getMarkerCount: ->
93-
Object.keys(@markersById).length
96+
@markersById.size
9497

9598
# Public: Find markers in the layer conforming to the given parameters.
9699
#
@@ -129,13 +132,17 @@ class MarkerLayer
129132
continue
130133
delete params[key]
131134

132-
markerIds ?= new Set(Object.keys(@markersById))
133-
134135
result = []
135-
markerIds.forEach (markerId) =>
136-
marker = @markersById[markerId]
137-
return unless marker.matchesParams(params)
138-
result.push(marker)
136+
if markerIds?
137+
markerIds.forEach (markerId) =>
138+
marker = @markersById.get(markerId)
139+
if marker.matchesParams(params)
140+
result.push(marker)
141+
else
142+
@markersById.forEach (marker) =>
143+
if marker.matchesParams(params)
144+
result.push(marker)
145+
139146
result.sort (a, b) -> a.compare(b)
140147

141148
###
@@ -256,7 +263,7 @@ class MarkerLayer
256263
splice: (start, oldExtent, newExtent) ->
257264
invalidated = @index.splice(start, oldExtent, newExtent)
258265
invalidated.touch.forEach (id) =>
259-
marker = @markersById[id]
266+
marker = @markersById.get(id)
260267
@touchedMarkers.add(id)
261268
if invalidated[marker.getInvalidationStrategy()]?.has(id)
262269
if @destroyInvalidatedMarkers
@@ -269,40 +276,38 @@ class MarkerLayer
269276
return unless snapshots?
270277

271278
snapshotIds = Object.keys(snapshots)
272-
existingMarkerIds = Object.keys(@markersById)
279+
existingMarkerIds = Array.from(@markersById.keys())
273280

274281
for id in snapshotIds
275282
snapshot = snapshots[id]
276-
if marker = @markersById[id]
283+
if marker = @markersById.get(parseInt(id))
277284
marker.update(marker.getRange(), snapshot, true)
278285
else
279286
newMarker = @createMarker(snapshot.range, snapshot)
280287

281288
for id in existingMarkerIds
282-
if (marker = @markersById[id]) and (not snapshots[id]?)
289+
if (marker = @markersById.get(parseInt(id))) and (not snapshots[id]?)
283290
marker.destroy()
284291

285292
@delegate.markersUpdated(this)
286293

287294
createSnapshot: ->
288295
result = {}
289296
ranges = @index.dump()
290-
for id in Object.keys(@markersById)
291-
marker = @markersById[id]
297+
@markersById.forEach (marker, id) =>
292298
result[id] = marker.getSnapshot(Range.fromObject(ranges[id]), false)
293299
result
294300

295301
emitChangeEvents: (snapshot) ->
296302
@markersIdsWithChangeSubscriptions.forEach (id) =>
297-
if marker = @markersById[id] # event handlers could destroy markers
303+
if marker = @markersById.get(id) # event handlers could destroy markers
298304
marker.emitChangeEvent(snapshot?[id]?.range, true, false)
299305
@delegate.markersUpdated(this)
300306

301307
serialize: ->
302308
ranges = @index.dump()
303309
markersById = {}
304-
for id in Object.keys(@markersById)
305-
marker = @markersById[id]
310+
@markersById.forEach (marker, id) =>
306311
markersById[id] = marker.getSnapshot(Range.fromObject(ranges[id]), false)
307312
{@id, @maintainHistory, @persistent, markersById, version: SerializationVersion}
308313

@@ -314,7 +319,7 @@ class MarkerLayer
314319
for id, markerState of state.markersById
315320
range = Range.fromObject(markerState.range)
316321
delete markerState.range
317-
@addMarker(id, range, markerState)
322+
@addMarker(parseInt(id), range, markerState)
318323
return
319324

320325
###
@@ -327,8 +332,8 @@ class MarkerLayer
327332
@delegate.markersUpdated(this)
328333

329334
destroyMarker: (id) ->
330-
if @markersById.hasOwnProperty(id)
331-
delete @markersById[id]
335+
if @markersById.has(id)
336+
@markersById.delete(id)
332337
@markersIdsWithChangeSubscriptions.delete(id)
333338
@index.delete(id)
334339
@destroyedMarkers.add(id)
@@ -375,7 +380,9 @@ class MarkerLayer
375380
Point.assertValid(range.start)
376381
Point.assertValid(range.end)
377382
@index.insert(id, range.start, range.end)
378-
@markersById[id] = new Marker(id, this, range, params)
383+
marker = new Marker(id, this, range, params)
384+
@markersById.set(id, marker)
385+
marker
379386

380387
setDisableDidUpdateEvent: (@didUpdateEventDisabled) ->
381388

0 commit comments

Comments
 (0)