From 5eccad6517e90d0b4f275695f42701c2755a143f Mon Sep 17 00:00:00 2001 From: 132nd-Professor <132nd-Professor> Date: Fri, 12 Aug 2022 20:02:44 +0200 Subject: [PATCH] remove rayon, manual parallelization --- Cargo.toml | 1 - src/main.rs | 32 +++++++++++++++++++++----------- src/processor.rs | 11 ++++++----- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 58e4156..2c33aa4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" [dependencies] zip = {version = ">= 0.6.2", default-features = false, features = ["deflate"]} -rayon = "*" [profile.release] lto = true diff --git a/src/main.rs b/src/main.rs index 190ef73..ac41d83 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,8 @@ mod reader; mod tacview; mod writer; -use rayon::prelude::*; -use std::process; use std::sync::Arc; +use std::{process, thread}; use crate::{tacview::Coalition, writer::StringWriter}; @@ -22,22 +21,33 @@ fn main_inner() -> Result<(), Box> { println!("Processing {}", input_filename); let lines = reader::read_data(&input_filename, is_zip)?; - let (header, body) = processor::split_into_header_and_body(&lines)?; + let (header, body) = processor::split_into_header_and_body(lines)?; + + let coalition_per_line = Arc::new(processor::divide_body_by_coalition(&body)?); - let coalition_per_line = Arc::new(processor::divide_body_by_coalition(body)?); let header = Arc::new(header); let body = Arc::new(body); + let input_filename = Arc::new(input_filename); - let _: Vec<_> = vec![Coalition::Blue, Coalition::Red, Coalition::Purple] - .into_par_iter() + let handles: Vec<_> = vec![Coalition::Blue, Coalition::Red, Coalition::Purple] + .into_iter() .map(|c| { - let mut writer = writer::create_writer(is_zip, &input_filename.clone(), &c).unwrap(); - writer.write_strings(&header).unwrap(); - writer - .write_for_coalition(&body, &coalition_per_line.clone(), c) - .unwrap(); + let z = is_zip; + let b = body.clone(); + let coalitions = coalition_per_line.clone(); + let h = header.clone(); + let i = input_filename.clone(); + thread::spawn(move || { + let mut writer = writer::create_writer(z, &*i.clone(), &c).unwrap(); + writer.write_strings(&*h).unwrap(); + writer.write_for_coalition(&*b, &*coalitions, c).unwrap(); + }) }) .collect(); + for handle in handles { + handle.join().unwrap(); + } + Ok(()) } diff --git a/src/processor.rs b/src/processor.rs index d3d457e..15e4918 100644 --- a/src/processor.rs +++ b/src/processor.rs @@ -7,12 +7,12 @@ use crate::tacview::{Coalition, CoalitionIDs}; const COMMENT: char = '#'; const MINUS: char = '-'; -pub fn split_into_header_and_body(lines: &[S]) -> Result<(&[S], &[S]), ProcessingError> +pub fn split_into_header_and_body(mut lines: Vec) -> Result<(Vec, Vec), ProcessingError> where S: AsRef, { - let mut i = 0; - for line in lines { + let mut split_idx = 0; + for line in &lines { if line .as_ref() .chars() @@ -22,9 +22,10 @@ where { break; } - i += 1; + split_idx += 1; } - Ok((&lines[..i], &lines[i..])) + let body = lines.split_off(split_idx); + Ok((lines, body)) } pub fn divide_body_by_coalition(body: &[S]) -> Result, Box>