From b0455769297964f0b82ef0df78dad8da74e9bca9 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Mon, 14 May 2018 22:12:05 +0200 Subject: Reduced number of needless allocations to improve perf Current iterations: 26486 in 10 seconds --- src/engine/mod.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'src/engine/mod.rs') diff --git a/src/engine/mod.rs b/src/engine/mod.rs index b80a53c..446d3bf 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -188,17 +188,29 @@ impl GameState { } pub fn unoccupied_player_cells(&self, settings: &GameSettings) -> Vec { - (0..settings.size.y) - .flat_map(|y| (0..settings.size.x/2).map(|x| Point::new(x, y)).collect::>()) - .filter(|&p| !self.player_buildings.iter().any(|b| b.pos == p)) - .collect() + let mut result = Vec::with_capacity(settings.size.y as usize *settings.size.x as usize / 2); + for y in 0..settings.size.y { + for x in 0..settings.size.x/2 { + let pos = Point::new(x, y); + if !self.player_buildings.iter().any(|b| b.pos == pos) { + result.push(pos); + } + } + } + result } pub fn unoccupied_opponent_cells(&self, settings: &GameSettings) -> Vec { - (0..settings.size.y) - .flat_map(|y| (settings.size.x/2..settings.size.x).map(|x| Point::new(x, y)).collect::>()) - .filter(|&p| !self.opponent_buildings.iter().any(|b| b.pos == p)) - .collect() + let mut result = Vec::with_capacity(settings.size.y as usize *settings.size.x as usize / 2); + for y in 0..settings.size.y { + for x in settings.size.x/2..settings.size.x { + let pos = Point::new(x, y); + if !self.opponent_buildings.iter().any(|b| b.pos == pos) { + result.push(pos); + } + } + } + result } pub fn player_affordable_buildings(&self, settings: &GameSettings) -> Vec { -- cgit v1.2.3