Skip to content

Commit

Permalink
Where possible update extent min/max inplace for performance
Browse files Browse the repository at this point in the history
`extent.extend()` is immutable and makes a new Extent()
If we're just looping to build an extent out of points or smaller extents,
we can update min and max inplace for better performance.
  • Loading branch information
bhousel committed Aug 25, 2021
1 parent c129671 commit d9e0755
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 59 deletions.
5 changes: 2 additions & 3 deletions modules/core/validation/models.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Extent } from '@id-sdk/extent';
import { utilTotalExtent } from '../../util';
import { t } from '../../core/localizer';

export function validationIssue(attrs) {
Expand Down Expand Up @@ -45,9 +46,7 @@ export function validationIssue(attrs) {
return new Extent(this.loc);
}
if (this.entityIds && this.entityIds.length) {
return this.entityIds.reduce(function(extent, entityId) {
return extent.extend(resolver.entity(entityId).extent(resolver));
}, new Extent());
return utilTotalExtent(this.entityIds, resolver);
}
return null;
};
Expand Down
9 changes: 1 addition & 8 deletions modules/modes/select.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import { behaviorSelect } from '../behavior/select';
import { operationMove } from '../operations/move';
import { prefs } from '../core/preferences';

import { Extent } from '@id-sdk/extent';
import { geoChooseEdge } from '../geo';
import { geoMetersToLat, geoMetersToLon } from '@id-sdk/geo';
import { modeBrowse } from './browse';
Expand Down Expand Up @@ -305,13 +304,7 @@ export function modeSelect(context, selectedIDs) {
selectElements();

if (_follow) {
var extent = new Extent();
var graph = context.graph();
selectedIDs.forEach(function(id) {
var entity = context.entity(id);
extent = extent.extend(entity.extent(graph));
});

var extent = utilTotalExtent(selectedIDs, context.graph());
var loc = extent.center();
context.map().centerEase(loc);
// we could enter the mode multiple times, so reset follow for next time
Expand Down
11 changes: 2 additions & 9 deletions modules/osm/way.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { vecCross } from '@id-sdk/math';
import { osmEntity } from './entity';
import { osmLanes } from './lanes';
import { osmTagSuggestingArea, osmOneWayTags, osmRightSideIsInsideTags } from './tags';
import { utilArrayUniq } from '../util';
import { utilArrayUniq, utilTotalExtent } from '../util';
import { Extent } from '@id-sdk/extent';


Expand Down Expand Up @@ -45,14 +45,7 @@ Object.assign(osmWay.prototype, {

extent: function(resolver) {
return resolver.transient(this, 'extent', function() {
var extent = new Extent();
for (var i = 0; i < this.nodes.length; i++) {
var node = resolver.hasEntity(this.nodes[i]);
if (node) {
extent = extent.extend(node.extent());
}
}
return extent;
return utilTotalExtent(this.nodes, resolver);
});
},

Expand Down
17 changes: 5 additions & 12 deletions modules/renderer/map.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { geoRawMercator} from '../geo';
import { geoScaleToZoom, geoZoomToScale } from '@id-sdk/geo';
import { modeBrowse } from '../modes/browse';
import { svgAreas, svgLabels, svgLayers, svgLines, svgMidpoints, svgPoints, svgVertices } from '../svg';
import { utilFastMouse, utilFunctor, utilSetTransform, utilEntityAndDeepMemberIDs } from '../util/util';
import { utilFastMouse, utilFunctor, utilSetTransform, utilTotalExtent, utilEntityAndDeepMemberIDs } from '../util/util';
import { utilBindOnce } from '../util/bind_once';
import { utilDetect } from '../util/detect';
import { utilGetDimensions } from '../util/dimensions';
Expand Down Expand Up @@ -948,19 +948,12 @@ export function rendererMap(context) {
};


map.zoomToEase = function(obj, duration) {
map.zoomToEase = function(val, duration) {
var extent;
if (Array.isArray(obj)) {
obj.forEach(function(entity) {
var entityExtent = entity.extent(context.graph());
if (!extent) {
extent = entityExtent;
} else {
extent = extent.extend(entityExtent);
}
});
if (Array.isArray(val)) {
extent = utilTotalExtent(val, context.graph());
} else {
extent = obj.extent(context.graph());
extent = val.extent(context.graph());
}
if (!isFinite(extent.area())) return map;

Expand Down
5 changes: 4 additions & 1 deletion modules/services/streetside.js
Original file line number Diff line number Diff line change
Expand Up @@ -647,7 +647,10 @@ export default {
poly = geomRotatePoints(poly, -angle, origin);

let extent = poly.reduce((extent, point) => {
return extent.extend(new Extent(point));
// update extent in place
extent.min = [ Math.min(extent.min[0], point[0]), Math.min(extent.min[1], point[1]) ];
extent.max = [ Math.max(extent.max[0], point[0]), Math.max(extent.max[1], point[1]) ];
return extent;
}, new Extent());

// find nearest other bubble in the search polygon
Expand Down
10 changes: 3 additions & 7 deletions modules/ui/field.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@ import { t, localizer } from '../core/localizer';
import { locationManager } from '../core/locations';
import { svgIcon } from '../svg/icon';
import { uiTooltip } from './tooltip';
import { Extent } from '@id-sdk/extent';
import { uiFieldHelp } from './field_help';
import { uiFields } from './fields';
import { uiTagReference } from './tag_reference';
import { utilRebind, utilUniqueDomId } from '../util';
import { utilRebind, utilTotalExtent, utilUniqueDomId } from '../util';


export function uiField(context, presetField, entityIDs, options) {
Expand Down Expand Up @@ -40,12 +39,9 @@ export function uiField(context, presetField, entityIDs, options) {
var _state = '';
var _tags = {};

var _entityExtent;
var _entityExtent = null;
if (entityIDs && entityIDs.length) {
_entityExtent = entityIDs.reduce(function(extent, entityID) {
var entity = context.graph().entity(entityID);
return extent.extend(entity.extent(context.graph()));
}, new Extent());
_entityExtent = utilTotalExtent(entityIDs, context.graph());
}

var _locked = false;
Expand Down
10 changes: 6 additions & 4 deletions modules/ui/fields/restrictions.js
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,12 @@ export function uiFieldRestrictions(field, context) {
projection.scale(geoZoomToScale(z));

// Calculate extent of all key vertices
var extent = new Extent();
for (var i = 0; i < _intersection.vertices.length; i++) {
extent = extent.extend(_intersection.vertices[i].extent());
}
var extent = _intersection.vertices.reduce((extent, node) => {
// update extent in place
extent.min = [ Math.min(extent.min[0], node.loc[0]), Math.min(extent.min[1], node.loc[1]) ];
extent.max = [ Math.max(extent.max[0], node.loc[0]), Math.max(extent.max[1], node.loc[1]) ];
return extent;
}, new Extent());

// If this is a large intersection, adjust zoom to fit extent
if (_intersection.vertices.length > 1) {
Expand Down
9 changes: 2 additions & 7 deletions modules/ui/preset_list.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@ import { actionChangePreset } from '../actions/change_preset';
import { operationDelete } from '../operations/delete';
import { svgIcon } from '../svg/index';
import { uiTooltip } from './tooltip';
import { Extent } from '@id-sdk/extent';
import { uiPresetIcon } from './preset_icon';
import { uiTagReference } from './tag_reference';
import { utilKeybinding, utilNoAuto, utilRebind } from '../util';
import { utilKeybinding, utilNoAuto, utilRebind, utilTotalExtent } from '../util';


export function uiPresetList(context) {
Expand Down Expand Up @@ -483,11 +482,7 @@ export function uiPresetList(context) {

if (_entityIDs && _entityIDs.length) {
// calculate current location
const extent = _entityIDs.reduce(function(extent, entityID) {
var entity = context.graph().entity(entityID);
return extent.extend(entity.extent(context.graph()));
}, new Extent());
_currLoc = extent.center();
_currLoc = utilTotalExtent(_entityIDs, context.graph()).center();

// match presets
var presets = _entityIDs.map(function(entityID) {
Expand Down
17 changes: 9 additions & 8 deletions modules/util/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,18 @@ export function utilTagText(entity) {
}


// Accepts an array of entities -or- entityIDs
export function utilTotalExtent(array, graph) {
var extent = new Extent();
var val, entity;
for (var i = 0; i < array.length; i++) {
val = array[i];
entity = typeof val === 'string' ? graph.hasEntity(val) : val;
return array.reduce(function(extent, val) {
var entity = (typeof val === 'string' ? graph.hasEntity(val) : val);
if (entity) {
extent = extent.extend(entity.extent(graph));
var other = entity.extent(graph);
// update extent in place
extent.min = [ Math.min(extent.min[0], other.min[0]), Math.min(extent.min[1], other.min[1]) ];
extent.max = [ Math.max(extent.max[0], other.max[0]), Math.max(extent.max[1], other.max[1]) ];
}
}
return extent;
return extent;
}, new Extent());
}


Expand Down

0 comments on commit d9e0755

Please sign in to comment.