use ruvector_graph::{Edge, GraphDB, Label, Node, Properties, PropertyValue};
use std::time::Instant;
#[test]
fn test_node_creation_performance() {
let db = GraphDB::new();
let num_nodes = 10_000;
let start = Instant::now();
for i in 0..num_nodes {
let mut props = Properties::new();
props.insert("id".to_string(), PropertyValue::Integer(i));
let node = Node::new(
format!("node_{}", i),
vec![Label {
name: "Benchmark".to_string(),
}],
props,
);
db.create_node(node).unwrap();
}
let duration = start.elapsed();
println!("Created {} nodes in {:?}", num_nodes, duration);
println!(
"Rate: {:.2} nodes/sec",
num_nodes as f64 / duration.as_secs_f64()
);
assert!(
duration.as_secs() < 5,
"Node creation too slow: {:?}",
duration
);
}
#[test]
fn test_node_retrieval_performance() {
let db = GraphDB::new();
let num_nodes = 10_000;
for i in 0..num_nodes {
db.create_node(Node::new(format!("node_{}", i), vec![], Properties::new()))
.unwrap();
}
let start = Instant::now();
for i in 0..num_nodes {
let node = db.get_node(&format!("node_{}", i));
assert!(node.is_some());
}
let duration = start.elapsed();
println!("Retrieved {} nodes in {:?}", num_nodes, duration);
println!(
"Rate: {:.2} reads/sec",
num_nodes as f64 / duration.as_secs_f64()
);
assert!(
duration.as_secs() < 1,
"Node retrieval too slow: {:?}",
duration
);
}
#[test]
fn test_edge_creation_performance() {
let db = GraphDB::new();
let num_nodes = 1000;
let edges_per_node = 10;
for i in 0..num_nodes {
db.create_node(Node::new(format!("n{}", i), vec![], Properties::new()))
.unwrap();
}
let start = Instant::now();
for i in 0..num_nodes {
for j in 0..edges_per_node {
let to = (i + j + 1) % num_nodes;
let edge = Edge::new(
format!("e_{}_{}", i, j),
format!("n{}", i),
format!("n{}", to),
"CONNECTS".to_string(),
Properties::new(),
);
db.create_edge(edge).unwrap();
}
}
let duration = start.elapsed();
let total_edges = num_nodes * edges_per_node;
println!("Created {} edges in {:?}", total_edges, duration);
println!(
"Rate: {:.2} edges/sec",
total_edges as f64 / duration.as_secs_f64()
);
}
#[test]
fn test_large_graph_creation() {
let db = GraphDB::new();
let num_nodes = 100_000;
let start = Instant::now();
for i in 0..num_nodes {
if i % 10_000 == 0 {
println!("Created {} nodes...", i);
}
let node = Node::new(format!("large_{}", i), vec![], Properties::new());
db.create_node(node).unwrap();
}
let duration = start.elapsed();
println!("Created {} nodes in {:?}", num_nodes, duration);
println!(
"Rate: {:.2} nodes/sec",
num_nodes as f64 / duration.as_secs_f64()
);
}
#[test]
#[ignore] fn test_million_node_graph() {
let db = GraphDB::new();
let num_nodes = 1_000_000;
let start = Instant::now();
for i in 0..num_nodes {
if i % 100_000 == 0 {
println!("Created {} nodes...", i);
}
let node = Node::new(format!("mega_{}", i), vec![], Properties::new());
db.create_node(node).unwrap();
}
let duration = start.elapsed();
println!("Created {} nodes in {:?}", num_nodes, duration);
println!(
"Rate: {:.2} nodes/sec",
num_nodes as f64 / duration.as_secs_f64()
);
}
#[test]
fn test_memory_efficiency() {
let db = GraphDB::new();
let num_nodes = 10_000;
for i in 0..num_nodes {
let mut props = Properties::new();
props.insert("data".to_string(), PropertyValue::String("x".repeat(100)));
let node = Node::new(format!("mem_{}", i), vec![], props);
db.create_node(node).unwrap();
}
}
#[test]
fn test_property_heavy_nodes() {
let db = GraphDB::new();
let num_nodes = 1_000;
let props_per_node = 50;
let start = Instant::now();
for i in 0..num_nodes {
let mut props = Properties::new();
for j in 0..props_per_node {
props.insert(format!("prop_{}", j), PropertyValue::Integer(j as i64));
}
let node = Node::new(format!("heavy_{}", i), vec![], props);
db.create_node(node).unwrap();
}
let duration = start.elapsed();
println!(
"Created {} property-heavy nodes in {:?}",
num_nodes, duration
);
}
#[test]
fn test_regression_node_creation() {
let db = GraphDB::new();
let start = Instant::now();
for i in 0..1000 {
db.create_node(Node::new(format!("regr_{}", i), vec![], Properties::new()))
.unwrap();
}
let duration = start.elapsed();
assert!(
duration.as_millis() < 500,
"Regression detected: {:?}",
duration
);
}
#[test]
fn test_regression_node_retrieval() {
let db = GraphDB::new();
for i in 0..1000 {
db.create_node(Node::new(format!("regr_{}", i), vec![], Properties::new()))
.unwrap();
}
let start = Instant::now();
for i in 0..1000 {
let _ = db.get_node(&format!("regr_{}", i));
}
let duration = start.elapsed();
assert!(
duration.as_millis() < 100,
"Regression detected: {:?}",
duration
);
}
#[allow(dead_code)]
fn setup_benchmark_graph(num_nodes: usize) -> GraphDB {
let db = GraphDB::new();
for i in 0..num_nodes {
let mut props = Properties::new();
props.insert(
"name".to_string(),
PropertyValue::String(format!("Person{}", i)),
);
props.insert(
"age".to_string(),
PropertyValue::Integer((20 + (i % 60)) as i64),
);
db.create_node(Node::new(
format!("person_{}", i),
vec![Label {
name: "Person".to_string(),
}],
props,
))
.unwrap();
}
for i in 0..num_nodes / 10 {
let from = i;
let to = (i + 1) % num_nodes;
db.create_edge(Edge::new(
format!("knows_{}", i),
format!("person_{}", from),
format!("person_{}", to),
"KNOWS".to_string(),
Properties::new(),
))
.unwrap();
}
db
}