diff --git a/strafe-client/src/file.rs b/strafe-client/src/file.rs
index 2d0d3b9..0a92798 100644
--- a/strafe-client/src/file.rs
+++ b/strafe-client/src/file.rs
@@ -34,11 +34,20 @@ pub enum ReadFormat{
 }
 
 pub fn read<R:Read+std::io::Seek>(input:R)->Result<ReadFormat,ReadError>{
+	let t=std::time::Instant::now();
+	println!("reading fourcc...");
 	let mut buf=std::io::BufReader::new(input);
 	let peek=std::io::BufRead::fill_buf(&mut buf).map_err(ReadError::Io)?[0..4].to_owned();
+	let dt=t.elapsed();
+	println!("{:?} elapsed={:?}",core::str::from_utf8(&peek),dt);
+
+	let t=std::time::Instant::now();
+	println!("reading entire file...");
 	// reading the entire file is way faster than round tripping the disk constantly
 	let mut entire_file=Vec::new();
 	buf.read_to_end(&mut entire_file).map_err(ReadError::Io)?;
+	println!("elapsed={:?}",t.elapsed());
+
 	let cursor=std::io::Cursor::new(entire_file);
 	match peek.as_slice(){
 		#[cfg(feature="roblox")]
@@ -46,10 +55,15 @@ pub fn read<R:Read+std::io::Seek>(input:R)->Result<ReadFormat,ReadError>{
 		#[cfg(feature="source")]
 		b"VBSP"=>Ok(ReadFormat::Source(strafesnet_bsp_loader::read(cursor).map_err(ReadError::Source)?)),
 		#[cfg(feature="snf")]
-		b"SNFM"=>Ok(ReadFormat::SNFM(
-			strafesnet_snf::read_map(cursor).map_err(ReadError::StrafesNET)?
-			.into_complete_map().map_err(ReadError::StrafesNETMap)?
-		)),
+		b"SNFM"=>{
+			let t=std::time::Instant::now();
+			println!("decoding map...");
+			let map=
+				strafesnet_snf::read_map(cursor).map_err(ReadError::StrafesNET)?
+				.into_complete_map().map_err(ReadError::StrafesNETMap)?;
+			println!("elapsed={:?}",t.elapsed());
+			Ok(ReadFormat::SNFM(map))
+		},
 		#[cfg(feature="snf")]
 		b"SNFB"=>Ok(ReadFormat::SNFB(
 			strafesnet_snf::read_bot(cursor).map_err(ReadError::StrafesNET)?