From 922a6680e58851d5d46d06568dc3e16af21ab785 Mon Sep 17 00:00:00 2001 From: dgs4349 Date: Sun, 27 Sep 2020 12:52:04 -0400 Subject: [PATCH] assignments in loops can be slower --- src/js/game/belt_path.js | 7 ++++--- src/js/game/game_system_with_filter.js | 12 ++++++++---- src/js/game/systems/belt_reader.js | 7 ++----- src/js/game/systems/constant_signal.js | 7 ++----- src/js/game/systems/filter.js | 7 ++----- src/js/game/systems/hub.js | 14 ++++---------- src/js/game/systems/item_acceptor.js | 7 ++----- src/js/game/systems/item_ejector.js | 14 ++++---------- src/js/game/systems/item_processor.js | 7 ++----- src/js/game/systems/lever.js | 7 ++----- src/js/game/systems/logic_gate.js | 7 ++----- src/js/game/systems/miner.js | 7 ++----- src/js/game/systems/storage.js | 7 ++----- src/js/game/systems/underground_belt.js | 7 ++----- 14 files changed, 40 insertions(+), 77 deletions(-) diff --git a/src/js/game/belt_path.js b/src/js/game/belt_path.js index b162f09f..a2b5af63 100644 --- a/src/js/game/belt_path.js +++ b/src/js/game/belt_path.js @@ -565,9 +565,10 @@ export class BeltPath extends BasicSerializableObject { beltComp.assignedPath = null; const entityLength = beltComp.getEffectiveLengthTiles(); - assert(this.entityPath.indexOf(entity) >= 0, "Entity not contained for split"); - assert(this.entityPath.indexOf(entity) !== 0, "Entity is first"); - assert(this.entityPath.indexOf(entity) !== this.entityPath.length - 1, "Entity is last"); + const index = this.entityPath.indexOf(entity); + assert(index >= 0, "Entity not contained for split"); + assert(index !== 0, "Entity is first"); + assert(index !== this.entityPath.length - 1, "Entity is last"); let firstPathEntityCount = 0; let firstPathLength = 0; diff --git a/src/js/game/game_system_with_filter.js b/src/js/game/game_system_with_filter.js index 013502ab..23126166 100644 --- a/src/js/game/game_system_with_filter.js +++ b/src/js/game/game_system_with_filter.js @@ -37,7 +37,10 @@ export class GameSystemWithFilter extends GameSystem { } tryUpdateEntitiesArray() { - this.allEntitiesArray = [...this.allEntitiesSet.values()]; + if (this.allEntitiesArrayIsOutdated) { + this.allEntitiesArray = [...this.allEntitiesSet.values()]; + this.allEntitiesArrayIsOutdated = false; + } } /** @@ -93,15 +96,16 @@ export class GameSystemWithFilter extends GameSystem { //this.allEntities.sort((a, b) => a.uid - b.uid); // Remove all entities which are queued for destroy - this.tryUpdateEntitiesArray(); - - for (let i = 0; i < this.allEntitiesArray.length; ++i) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { const entity = this.allEntitiesArray[i]; if (entity.queuedForDestroy || entity.destroyed) { this.allEntitiesSet.delete(this.allEntitiesArray[i]); fastArrayDelete(this.allEntitiesArray, i); } } + + // called here in case a delete executed mid frame + this.tryUpdateEntitiesArray(); } /** diff --git a/src/js/game/systems/belt_reader.js b/src/js/game/systems/belt_reader.js index 7d93e5cc..4f1b98dd 100644 --- a/src/js/game/systems/belt_reader.js +++ b/src/js/game/systems/belt_reader.js @@ -13,11 +13,8 @@ export class BeltReaderSystem extends GameSystemWithFilter { const minimumTime = now - globalConfig.readerAnalyzeIntervalSeconds; const minimumTimeForThroughput = now - 1; - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const readerComp = entity.components.BeltReader; const pinsComp = entity.components.WiredPins; diff --git a/src/js/game/systems/constant_signal.js b/src/js/game/systems/constant_signal.js index 4803347e..5a6542f9 100644 --- a/src/js/game/systems/constant_signal.js +++ b/src/js/game/systems/constant_signal.js @@ -19,11 +19,8 @@ export class ConstantSignalSystem extends GameSystemWithFilter { update() { // Set signals - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const pinsComp = entity.components.WiredPins; const signalComp = entity.components.ConstantSignal; pinsComp.slots[0].value = signalComp.signal; diff --git a/src/js/game/systems/filter.js b/src/js/game/systems/filter.js index b9cd3f2d..53675858 100644 --- a/src/js/game/systems/filter.js +++ b/src/js/game/systems/filter.js @@ -20,11 +20,8 @@ export class FilterSystem extends GameSystemWithFilter { const requiredProgress = 1 - progress; - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const filterComp = entity.components.Filter; const ejectorComp = entity.components.ItemEjector; diff --git a/src/js/game/systems/hub.js b/src/js/game/systems/hub.js index 56442e39..556a9412 100644 --- a/src/js/game/systems/hub.js +++ b/src/js/game/systems/hub.js @@ -25,21 +25,15 @@ export class HubSystem extends GameSystemWithFilter { * @param {DrawParameters} parameters */ draw(parameters) { - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; this.drawEntity(parameters, entity); } } update() { - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const pinsComp = entity.components.WiredPins; pinsComp.slots[0].value = this.root.shapeDefinitionMgr.getShapeItemFromDefinition( this.root.hubGoals.currentGoal.definition diff --git a/src/js/game/systems/item_acceptor.js b/src/js/game/systems/item_acceptor.js index 2a071b5e..8d0977d4 100644 --- a/src/js/game/systems/item_acceptor.js +++ b/src/js/game/systems/item_acceptor.js @@ -39,11 +39,8 @@ export class ItemAcceptorSystem extends GameSystemWithFilter { // Reset accumulated ticks this.accumulatedTicksWhileInMapOverview = 0; - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const aceptorComp = entity.components.ItemAcceptor; const animations = aceptorComp.itemConsumptionAnimations; diff --git a/src/js/game/systems/item_ejector.js b/src/js/game/systems/item_ejector.js index ce4bcdd9..1b33e86f 100644 --- a/src/js/game/systems/item_ejector.js +++ b/src/js/game/systems/item_ejector.js @@ -61,11 +61,8 @@ export class ItemEjectorSystem extends GameSystemWithFilter { */ recomputeCacheFull() { logger.log("Full cache recompute in post load hook"); - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; this.recomputeSingleEntityCache(entity); } } @@ -150,11 +147,8 @@ export class ItemEjectorSystem extends GameSystemWithFilter { } // Go over all cache entries - for ( - let i = this.allEntitiesArray.length - 1, sourceEntity; - (sourceEntity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const sourceEntity = this.allEntitiesArray[i]; const sourceEjectorComp = sourceEntity.components.ItemEjector; const slots = sourceEjectorComp.slots; diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index 01510c7a..20ea5d04 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -68,11 +68,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { } update() { - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const processorComp = entity.components.ItemProcessor; const ejectorComp = entity.components.ItemEjector; diff --git a/src/js/game/systems/lever.js b/src/js/game/systems/lever.js index 21f467ba..0997f6a1 100644 --- a/src/js/game/systems/lever.js +++ b/src/js/game/systems/lever.js @@ -14,11 +14,8 @@ export class LeverSystem extends GameSystemWithFilter { } update() { - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const leverComp = entity.components.Lever; const pinsComp = entity.components.WiredPins; diff --git a/src/js/game/systems/logic_gate.js b/src/js/game/systems/logic_gate.js index 6056dc7d..ef42c649 100644 --- a/src/js/game/systems/logic_gate.js +++ b/src/js/game/systems/logic_gate.js @@ -30,11 +30,8 @@ export class LogicGateSystem extends GameSystemWithFilter { } update() { - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const logicComp = entity.components.LogicGate; const slotComp = entity.components.WiredPins; diff --git a/src/js/game/systems/miner.js b/src/js/game/systems/miner.js index a86da376..1b4734df 100644 --- a/src/js/game/systems/miner.js +++ b/src/js/game/systems/miner.js @@ -36,11 +36,8 @@ export class MinerSystem extends GameSystemWithFilter { miningSpeed *= 100; } - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const minerComp = entity.components.Miner; // Reset everything on recompute diff --git a/src/js/game/systems/storage.js b/src/js/game/systems/storage.js index 836c7bde..69eb5a3f 100644 --- a/src/js/game/systems/storage.js +++ b/src/js/game/systems/storage.js @@ -26,11 +26,8 @@ export class StorageSystem extends GameSystemWithFilter { } update() { - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const storageComp = entity.components.Storage; const pinsComp = entity.components.WiredPins; diff --git a/src/js/game/systems/underground_belt.js b/src/js/game/systems/underground_belt.js index ce238abd..8e736441 100644 --- a/src/js/game/systems/underground_belt.js +++ b/src/js/game/systems/underground_belt.js @@ -223,11 +223,8 @@ export class UndergroundBeltSystem extends GameSystemWithFilter { update() { this.staleAreaWatcher.update(); - for ( - let i = this.allEntitiesArray.length - 1, entity; - (entity = this.allEntitiesArray[i]) && i >= 0; - --i - ) { + for (let i = this.allEntitiesArray.length - 1; i >= 0; --i) { + const entity = this.allEntitiesArray[i]; const undergroundComp = entity.components.UndergroundBelt; if (undergroundComp.mode === enumUndergroundBeltMode.sender) { this.handleSender(entity);