Compare commits

..

1 Commits
main ... sync

Author SHA1 Message Date
a4949a0d6a Updated Synchronous code to record total time of execution 2023-05-22 14:22:30 +01:00
2 changed files with 15 additions and 33 deletions

View File

@ -6,7 +6,6 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
futures = "0.3.28"
mongodb = "2.5.0" mongodb = "2.5.0"
serde = "1.0.163" serde = "1.0.163"
tokio = "1.28.1" tokio = "1.28.1"

View File

@ -1,8 +1,5 @@
use mongodb::{Client, options::{ClientOptions, Credential}, Collection}; use mongodb::{Client, options::{ClientOptions, Credential}};
use std::time::{self, SystemTime, Duration}; use std::time::{self, SystemTime};
use tokio::task;
use std::sync::Mutex;
use std::sync::Arc;
mod packet; mod packet;
use packet::Packet; use packet::Packet;
@ -31,40 +28,26 @@ async fn main() {
_ => {} _ => {}
} }
//Setup the number of queries that we want to run as well as Arcs and Mutexes to pass to threads
const NUM_QUERIES: u32 = 5_000; const NUM_QUERIES: u32 = 5_000;
let collection: Arc<Collection<Packet>> = Arc::new(db.collection::<Packet>("test")); let collection = db.collection::<Packet>("test");
let mut tasks = vec![]; let mut queries: Vec<std::time::Duration> = vec![];
let queries: Arc<Mutex<Vec<Duration>>> = Arc::new(Mutex::new(vec![]));
let start_time = SystemTime::now(); let start_time = SystemTime::now();
//Start spawning threads to run the requests
for _ in 0..NUM_QUERIES { for _ in 0..NUM_QUERIES {
tasks.push(task::spawn(run_query(collection.clone(), queries.clone()))) let query_time = SystemTime::now();
}
futures::future::join_all(tasks).await;
//Print out the results collection.insert_one(Packet{
for (i, duration) in queries.lock().unwrap().iter().enumerate() { time: SystemTime::now(),
text: format!("Current Unix time: {:?}", SystemTime::now().duration_since(time::UNIX_EPOCH).unwrap())
}, None).await.unwrap();
let duration = SystemTime::now().duration_since(query_time).unwrap();
queries.push(duration);
}
for (i, duration) in queries.iter().enumerate() {
println!("{}: {}.{} milliseconds", i, duration.as_millis(), duration.as_micros()); println!("{}: {}.{} milliseconds", i, duration.as_millis(), duration.as_micros());
} }
println!("Ran {} queries in {}s", NUM_QUERIES, time::SystemTime::now().duration_since(start_time).unwrap().as_secs_f32()); println!("Ran {} queries in {} seconds.", NUM_QUERIES, SystemTime::now().duration_since(start_time).unwrap().as_secs_f32());
}
/// Function that runs an upload to a a MongoDB collection with a recorded timestamp
/// asynchronously
async fn run_query(collection: Arc<Collection::<Packet>>, query_records: Arc<Mutex<Vec<Duration>>>) {
//Record the start time for a query
let query_time = SystemTime::now();
//Perform the insert
collection.insert_one(Packet{
time: SystemTime::now(),
text: format!("Current Unix time: {:?}", SystemTime::now().duration_since(time::UNIX_EPOCH).unwrap())
}, None).await.unwrap();
//Record the duration and add it to the list
let duration = SystemTime::now().duration_since(query_time).unwrap();
query_records.lock().unwrap().push(duration);
} }