feat: parallelise the location route
This commit is contained in:
parent
73fdfd3263
commit
73bf8a41fe
File diff suppressed because it is too large
Load Diff
|
@ -11,7 +11,9 @@ base64 = "0.21"
|
|||
bytes = "1"
|
||||
chrono = "0.4"
|
||||
if_chain = "1"
|
||||
parking_lot = "0.12"
|
||||
rand = "0.8"
|
||||
rayon = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_yaml = "0.9"
|
||||
sha3 = "0.10"
|
||||
|
|
|
@ -2,8 +2,10 @@ use std::sync::Arc;
|
|||
|
||||
use anyhow::Context;
|
||||
use chrono::{Duration, Utc};
|
||||
use parking_lot::RwLock;
|
||||
use rand::Rng;
|
||||
use rand::seq::SliceRandom;
|
||||
use rayon::prelude::*;
|
||||
use serde::Deserialize;
|
||||
use warp::{Filter, Rejection, Reply};
|
||||
use warp::filters::BoxedFilter;
|
||||
|
@ -99,12 +101,12 @@ fn filter_messages(messages: &mut Vec<RetrievedMessage>, id: i64) {
|
|||
messages.shuffle(&mut rand::thread_rng());
|
||||
|
||||
// just count nearby messages. this is O(n^2) but alternatives are hard
|
||||
let mut ids = Vec::with_capacity(messages.len());
|
||||
for a in messages.iter() {
|
||||
let ids = RwLock::new(Vec::with_capacity(messages.len()));
|
||||
messages.par_iter()
|
||||
.for_each(|a| {
|
||||
if a.user == id {
|
||||
// always include own messages
|
||||
ids.push(a.id.clone());
|
||||
continue;
|
||||
ids.write().push(a.id.clone());
|
||||
return;
|
||||
}
|
||||
|
||||
let mut nearby_ids = Vec::new();
|
||||
|
@ -129,11 +131,15 @@ fn filter_messages(messages: &mut Vec<RetrievedMessage>, id: i64) {
|
|||
// no need to do calculations for groups of three or fewer
|
||||
(17, 20)
|
||||
} else {
|
||||
let already_visible = nearby_ids.iter()
|
||||
let already_visible = {
|
||||
let ids = ids.read();
|
||||
nearby_ids.iter()
|
||||
.filter(|id| ids.contains(id))
|
||||
.count();
|
||||
.count()
|
||||
};
|
||||
|
||||
if already_visible >= 3 {
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
|
||||
let time_since_creation = a.created.signed_duration_since(Utc::now().naive_utc());
|
||||
|
@ -165,9 +171,10 @@ fn filter_messages(messages: &mut Vec<RetrievedMessage>, id: i64) {
|
|||
};
|
||||
|
||||
if rand::thread_rng().gen_ratio(numerator.min(denominator), denominator) {
|
||||
ids.push(a.id.clone());
|
||||
}
|
||||
ids.write().push(a.id.clone());
|
||||
}
|
||||
});
|
||||
|
||||
let ids = ids.into_inner();
|
||||
messages.drain_filter(|msg| !ids.contains(&msg.id));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue