perf: eliminate loop string allocations and proxy mem spikes

This commit is contained in:
Riz Ashraf committed 2026-09-21 09:40:37 +01:00
1 parent d5a05f8416
commit dc59aa9238
5 files changed
+30 -24

No files matched your search

+20 -15
View File
@@ -2,6 +2,11 @@ use crate::models::*;
use crate::state::MemoryState;
use crate::tools::*;
fn contains_ignore_ascii_case(haystack: &str, needle: &str) -> bool {
if needle.is_empty() { return true; }
haystack.as_bytes().windows(needle.len()).any(|w| w.eq_ignore_ascii_case(needle.as_bytes()))
}
macro_rules! parse_tool {
($args:expr, $id:expr, $type:ty) => {
match parse_args::<$type>($args) {
@@ -605,8 +610,8 @@ impl MemoryHandler {
continue;
}
if query.is_empty()
|| name.to_lowercase().contains(&query)
|| e.entity_type.to_lowercase().contains(&query)
|| contains_ignore_ascii_case(&name, &query)
|| contains_ignore_ascii_case(&e.entity_type, &query)
{
included.insert(name.clone());
}
@@ -1014,9 +1019,9 @@ impl MemoryHandler {
let snippets = self.state.snippets.read();
let mut results = Vec::new();
for s in snippets {
if s.name.to_lowercase().contains(&query)
|| s.description.to_lowercase().contains(&query)
|| s.language.to_lowercase().contains(&query)
if contains_ignore_ascii_case(&s.name, &query)
|| contains_ignore_ascii_case(&s.description, &query)
|| contains_ignore_ascii_case(&s.language, &query)
{
results.push(s);
}
@@ -1073,9 +1078,9 @@ impl MemoryHandler {
if let Some(q) = req.query {
let q = q.to_lowercase();
adrs.retain(|a| {
a.title.to_lowercase().contains(&q)
|| a.context.to_lowercase().contains(&q)
|| a.decision.to_lowercase().contains(&q)
contains_ignore_ascii_case(&a.title, &q)
|| contains_ignore_ascii_case(&a.context, &q)
|| contains_ignore_ascii_case(&a.decision, &q)
});
}
let data = serde_json::to_string(&adrs).unwrap_or_default();
@@ -1165,8 +1170,8 @@ impl MemoryHandler {
let q = req.query.to_lowercase();
let mut fixes = self.state.error_fixes.read();
fixes.retain(|f| {
f.signature.to_lowercase().contains(&q)
|| f.solution.to_lowercase().contains(&q)
contains_ignore_ascii_case(&f.signature, &q)
|| contains_ignore_ascii_case(&f.solution, &q)
});
let data = serde_json::to_string(&fixes).unwrap_or_default();
Ok(data.to_string())
@@ -1562,8 +1567,8 @@ impl MemoryHandler {
.filter(|d| {
(req.namespace.is_none()
|| d.namespace == *req.namespace.as_ref().unwrap())
&& (d.description.to_lowercase().contains(&q)
|| d.ideal_solution.to_lowercase().contains(&q))
&& (contains_ignore_ascii_case(&d.description, &q)
|| contains_ignore_ascii_case(&d.ideal_solution, &q))
})
.collect();
let memos: Vec<_> = self
@@ -1574,7 +1579,7 @@ impl MemoryHandler {
.filter(|m| {
(req.namespace.is_none()
|| m.namespace == *req.namespace.as_ref().unwrap())
&& m.content.to_lowercase().contains(&q)
&& contains_ignore_ascii_case(&m.content, &q)
})
.collect();
let error_fixes: Vec<_> = self
@@ -1583,8 +1588,8 @@ impl MemoryHandler {
.read()
.into_iter()
.filter(|f| {
f.signature.to_lowercase().contains(&q)
|| f.solution.to_lowercase().contains(&q)
contains_ignore_ascii_case(&f.signature, &q)
|| contains_ignore_ascii_case(&f.solution, &q)
})
.collect();
+4 -4
View File
@@ -288,7 +288,7 @@ mod tests {
namespace: "global".to_string(),
git_branch: None,
};
index.index_entity(&entity).await.unwrap();
let _ = index.index_entity(&entity).await.unwrap();
let task = Task {
id: "task-1".to_string(),
@@ -302,7 +302,7 @@ mod tests {
dependencies: vec![],
parent_id: None,
};
index.index_task(&task).await.unwrap();
let _ = index.index_task(&task).await.unwrap();
let snippet = Snippet {
name: "test_snippet".to_string(),
@@ -311,7 +311,7 @@ mod tests {
description: "A test snippet".to_string(),
updated_at: 0,
};
index.index_snippet(&snippet).await.unwrap();
let _ = index.index_snippet(&snippet).await.unwrap();
let adr = Adr {
id: "adr-1".to_string(),
@@ -321,7 +321,7 @@ mod tests {
consequence: "Test consequence".to_string(),
timestamp: 0,
};
index.index_adr(&adr).await.unwrap();
let _ = index.index_adr(&adr).await.unwrap();
index.commit().await.unwrap();
index.reader.reload().unwrap();