diff --git a/markdown_backend/Cargo.toml b/markdown_backend/Cargo.toml index 5a55a40..ac8f950 100644 --- a/markdown_backend/Cargo.toml +++ b/markdown_backend/Cargo.toml @@ -18,3 +18,4 @@ clap = { version = "4.4", features = ["derive"] } serde_json = "1.0" html-escape = "0.2.13" once_cell = "1.18" +sysinfo = "0.30.7" diff --git a/markdown_backend/src/markdown.rs b/markdown_backend/src/markdown.rs index 6e3a529..fbfe6f6 100644 --- a/markdown_backend/src/markdown.rs +++ b/markdown_backend/src/markdown.rs @@ -1,4 +1,13 @@ // src/markdown.rs +/* + +This is the Rust Markdown Parser. +It supports caching of posts and is + +BLAZINGLY FAST! + +*/ + use std::fs; use std::path::{Path, PathBuf}; @@ -19,6 +28,7 @@ use once_cell::sync::Lazy; use std::collections::HashMap; use std::sync::RwLock; use serde_json; +use sysinfo::{System, Pid, RefreshKind, CpuRefreshKind, ProcessRefreshKind}; #[derive(Debug, Deserialize, Clone, serde::Serialize)] pub struct PostFrontmatter { @@ -47,6 +57,8 @@ pub struct PostStats { pub cache_misses: u64, pub last_interpret_time_ms: u128, pub last_compile_time_ms: u128, + pub last_cpu_usage_percent: f32, // Not f64 + pub last_cache_status: String, // "hit" or "miss" } static POST_CACHE: Lazy>> = Lazy::new(|| RwLock::new(HashMap::new())); @@ -95,10 +107,10 @@ fn process_anchor_links(content: &str) -> String { } // Helper function to strip emojis from a string +// Neccesary for the slugify function to work correctly. And the ID's to work with the frontend. fn strip_emojis(s: &str) -> String { // Remove all characters in the Emoji Unicode ranges // This is a simple approach and may not cover all emojis, but works for most cases - // Unicode emoji ranges: https://unicode.org/Public/emoji/15.0/emoji-data.txt s.chars() .filter(|c| { let c = *c as u32; @@ -128,11 +140,22 @@ static AMMONIA: Lazy> = Lazy::new(|| { }); pub fn rsparseinfo() -> String { + // Eagerly load all posts to populate stats + let _ = get_all_posts(); let stats = POST_STATS.read().unwrap(); - serde_json::to_string(&stats.values().collect::>()).unwrap_or_else(|_| "[]".to_string()) + let values: Vec<&PostStats> = stats.values().collect(); + if values.is_empty() { + "[]".to_string() + } else { + serde_json::to_string(&values).unwrap_or_else(|_| "[]".to_string()) + } } pub fn get_post_by_slug(slug: &str) -> Result> { + let mut sys = System::new_with_specifics(RefreshKind::new().with_processes(ProcessRefreshKind::everything()).with_cpu(CpuRefreshKind::everything())); + sys.refresh_processes(); + let pid = sysinfo::get_current_pid()?; + let before_cpu = sys.process(pid).map(|p| p.cpu_usage()).unwrap_or(0.0); let start = Instant::now(); let mut stats = POST_STATS.write().unwrap(); let entry = stats.entry(slug.to_string()).or_insert_with(|| PostStats { @@ -144,9 +167,13 @@ pub fn get_post_by_slug(slug: &str) -> Result> entry.cache_hits += 1; entry.last_interpret_time_ms = 0; entry.last_compile_time_ms = 0; + entry.last_cache_status = "hit".to_string(); + sys.refresh_process(pid); + entry.last_cpu_usage_percent = sys.process(pid).map(|p| p.cpu_usage()).unwrap_or(0.0) - before_cpu; return Ok(post); } entry.cache_misses += 1; + entry.last_cache_status = "miss".to_string(); drop(stats); // Release lock before heavy work let posts_dir = get_posts_directory(); let file_path = posts_dir.join(format!("{}.md", slug)); @@ -180,7 +207,7 @@ pub fn get_post_by_slug(slug: &str) -> Result> let mut code_block_lang = String::new(); let mut code_block_content = String::new(); let mut events = Vec::new(); - let ss = SyntaxSet::load_defaults_newlines(); + let ss = SyntaxSet::load_defaults_newlines(); // SS 卐 let ts = ThemeSet::load_defaults(); let theme = &ts.themes["base16-ocean.dark"]; for event in parser { @@ -261,6 +288,8 @@ pub fn get_post_by_slug(slug: &str) -> Result> }); entry.last_interpret_time_ms = interpret_time.as_millis(); entry.last_compile_time_ms = compile_time.as_millis(); + sys.refresh_process(pid); + entry.last_cpu_usage_percent = sys.process(pid).map(|p| p.cpu_usage()).unwrap_or(0.0) - before_cpu; Ok(post) } diff --git a/src/lib/markdown.ts b/src/lib/markdown.ts index 4a4a8aa..8f36e2e 100644 --- a/src/lib/markdown.ts +++ b/src/lib/markdown.ts @@ -1,3 +1,12 @@ +// This is the frontend Markdown parser. +// It is written in TypeScript +// While I was writing this, only I and God knew how it works. +// Now, only God knows. +// +// If you are trying to understand how it works , and optimize it. Please increse the counter +// +// Hours wasted here: 12 + import fs from 'fs'; import path from 'path'; import matter from 'gray-matter';