#[cfg(feature = "dhat-heap")]
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;
use ergonomic_windows::string::{from_wide, to_wide, WideString, WideStringBuilder};
fn main() {
#[cfg(feature = "dhat-heap")]
let _profiler = dhat::Profiler::new_heap();
println!("=== Memory Profiling for ergonomic-windows ===\n");
profile_string_conversions();
profile_wide_string();
profile_wide_string_builder();
profile_repeated_allocations();
profile_large_strings();
println!("\n=== Profiling Complete ===");
println!("Check dhat-heap.json for detailed heap analysis");
}
fn profile_string_conversions() {
println!("--- String Conversions ---");
for _ in 0..1000 {
let wide = to_wide("Hello, World!");
let _ = from_wide(&wide);
}
let medium = "a".repeat(1000);
for _ in 0..100 {
let wide = to_wide(&medium);
let _ = from_wide(&wide);
}
println!("Completed 1000 small + 100 medium string conversions");
}
fn profile_wide_string() {
println!("--- WideString Creation ---");
let strings: Vec<WideString> = (0..1000)
.map(|i| WideString::new(&format!("String number {}", i)))
.collect();
for s in &strings {
let _ = s.as_ptr();
}
println!("Created and used 1000 WideStrings");
}
fn profile_wide_string_builder() {
println!("--- WideStringBuilder ---");
for _ in 0..100 {
let mut builder = WideStringBuilder::new();
for j in 0..50 {
builder.push(&format!("segment_{}_", j));
}
let _ = builder.build();
}
for _ in 0..100 {
let mut builder = WideStringBuilder::with_capacity(1000);
for j in 0..50 {
builder.push(&format!("segment_{}_", j));
}
let _ = builder.build();
}
println!("Built 200 strings (100 without prealloc, 100 with prealloc)");
}
fn profile_repeated_allocations() {
println!("--- Repeated Allocations Pattern ---");
let mut results = Vec::new();
for i in 0..500 {
let s = to_wide(&format!("Iteration {}: Some data here", i));
if i % 2 == 0 {
results.push(s);
}
}
results.truncate(125);
for i in 500..750 {
results.push(to_wide(&format!("Second batch {}", i)));
}
println!(
"Completed fragmentation test with {} retained strings",
results.len()
);
}
fn profile_large_strings() {
println!("--- Large Strings ---");
for size in [10_000, 100_000, 500_000] {
let large = "x".repeat(size);
let wide = to_wide(&large);
let back = from_wide(&wide).unwrap();
assert_eq!(large.len(), back.len());
println!("Converted {} char string successfully", size);
}
}