This commit is contained in:
TechnoPorg committed 2026-02-11 22:29:54 +01:00
1 parent 86787b3a0d
commit 6f7a58e4c5
10 files changed
+53 -57

No files matched your search

+21 -21
View File
@@ -12,7 +12,7 @@ pub fn bench_dag_execution(c: &mut Criterion) {
rt.block_on(async { rt.block_on(async {
let dag = DagRunner::new(); let dag = DagRunner::new();
for i in 0..10 { for i in 0..10 {
dag.add_task(task_fn::<(), _, _>(move |_: ()| { i })); dag.add_task(task_fn::<(), _, _>(move |_: ()| i));
} }
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap)) dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
.await .await
@@ -26,7 +26,7 @@ pub fn bench_dag_execution(c: &mut Criterion) {
rt.block_on(async { rt.block_on(async {
let dag = DagRunner::new(); let dag = DagRunner::new();
for i in 0..100 { for i in 0..100 {
dag.add_task(task_fn::<(), _, _>(move |_: ()| { i })); dag.add_task(task_fn::<(), _, _>(move |_: ()| i));
} }
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap)) dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
.await .await
@@ -51,61 +51,61 @@ pub fn bench_dag_execution(c: &mut Criterion) {
let t0 = dag.add_task(Value(0)); let t0 = dag.add_task(Value(0));
let t1 = dag let t1 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t0); .depends_on(t0);
let t2 = dag let t2 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t1); .depends_on(t1);
let t3 = dag let t3 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t2); .depends_on(t2);
let t4 = dag let t4 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t3); .depends_on(t3);
let t5 = dag let t5 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t4); .depends_on(t4);
let t6 = dag let t6 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t5); .depends_on(t5);
let t7 = dag let t7 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t6); .depends_on(t6);
let t8 = dag let t8 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t7); .depends_on(t7);
let t9 = dag let t9 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t8); .depends_on(t8);
let t10 = dag let t10 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t9); .depends_on(t9);
let t11 = dag let t11 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t10); .depends_on(t10);
let t12 = dag let t12 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t11); .depends_on(t11);
let t13 = dag let t13 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t12); .depends_on(t12);
let t14 = dag let t14 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t13); .depends_on(t13);
let t15 = dag let t15 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t14); .depends_on(t14);
let t16 = dag let t16 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t15); .depends_on(t15);
let t17 = dag let t17 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t16); .depends_on(t16);
let t18 = dag let t18 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t17); .depends_on(t17);
let _t19 = dag let _t19 = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(t18); .depends_on(t18);
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap)) dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
+1 -1
View File
@@ -17,7 +17,7 @@ pub fn bench_dag_scaling(c: &mut Criterion) {
rt.block_on(async { rt.block_on(async {
let dag = DagRunner::new(); let dag = DagRunner::new();
for i in 0..size { for i in 0..size {
dag.add_task(task_fn::<(), _, _>(move |_: ()| { i })); dag.add_task(task_fn::<(), _, _>(move |_: ()| i));
} }
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap)) dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
.await .await
+3 -3
View File
@@ -18,14 +18,14 @@ pub fn bench_deep_chain(c: &mut Criterion) {
let dag = DagRunner::new(); let dag = DagRunner::new();
let first: TaskHandle<_> = dag.add_task(task_fn::<(), _, _>(|_: ()| { 0 })).into(); let first: TaskHandle<_> = dag.add_task(task_fn::<(), _, _>(|_: ()| 0)).into();
let mut prev = dag let mut prev = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(first); .depends_on(first);
for i in 2..100 { for i in 2..100 {
prev = dag prev = dag
.add_task(task_fn::<i32, _, _>(move |&x: &i32| { x + i })) .add_task(task_fn::<i32, _, _>(move |&x: &i32| x + i))
.depends_on(prev); .depends_on(prev);
} }
+4 -4
View File
@@ -25,19 +25,19 @@ pub fn bench_etl_pipeline(c: &mut Criterion) {
// Transform each source // Transform each source
let transform1 = dag let transform1 = dag
.add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| { .add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| {
data.into_iter().map(|x| x * 2).collect::<Vec<_>>() data.iter().map(|x| x * 2).collect::<Vec<_>>()
})) }))
.depends_on(source1); .depends_on(source1);
let transform2 = dag let transform2 = dag
.add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| { .add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| {
data.into_iter().map(|x| x * 2).collect::<Vec<_>>() data.iter().map(|x| x * 2).collect::<Vec<_>>()
})) }))
.depends_on(source2); .depends_on(source2);
let transform3 = dag let transform3 = dag
.add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| { .add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| {
data.into_iter().map(|x| x * 2).collect::<Vec<_>>() data.iter().map(|x| x * 2).collect::<Vec<_>>()
})) }))
.depends_on(source3); .depends_on(source3);
@@ -66,7 +66,7 @@ pub fn bench_etl_pipeline(c: &mut Criterion) {
// Load (compute sum) // Load (compute sum)
let load = dag let load = dag
.add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| { .add_task(task_fn::<Vec<_>, _, _>(|data: &Vec<i32>| {
data.into_iter().sum::<i32>() data.iter().sum::<i32>()
})) }))
.depends_on(validate); .depends_on(validate);
+1 -1
View File
@@ -19,7 +19,7 @@ pub fn bench_large_scale(c: &mut Criterion) {
let dag = DagRunner::new(); let dag = DagRunner::new();
for i in 0..10_000 { for i in 0..10_000 {
dag.add_task(task_fn::<(), _, _>(move |_: ()| { i * 2 })); dag.add_task(task_fn::<(), _, _>(move |_: ()| i * 2));
} }
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap)) dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
+5 -5
View File
@@ -17,18 +17,18 @@ pub fn bench_linear_pipeline(c: &mut Criterion) {
let dag = DagRunner::new(); let dag = DagRunner::new();
let a = dag.add_task(task_fn::<(), _, _>(|_: ()| { 1 })); let a = dag.add_task(task_fn::<(), _, _>(|_: ()| 1));
let b = dag let b = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x + 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x + 1))
.depends_on(a); .depends_on(a);
let c = dag let c = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x * 2 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x * 2))
.depends_on(b); .depends_on(b);
let d = dag let d = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x - 1 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x - 1))
.depends_on(c); .depends_on(c);
let e = dag let e = dag
.add_task(task_fn::<i32, _, _>(|&x: &i32| { x * 3 })) .add_task(task_fn::<i32, _, _>(|&x: &i32| x * 3))
.depends_on(d); .depends_on(d);
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap)) dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
+2 -2
View File
@@ -17,11 +17,11 @@ pub fn bench_wide_fanout(c: &mut Criterion) {
use dagx::{task_fn, DagRunner}; use dagx::{task_fn, DagRunner};
let dag = DagRunner::new(); let dag = DagRunner::new();
let source: TaskHandle<_> = dag.add_task(task_fn::<(), _, _>(|_: ()| { 42 })).into(); let source: TaskHandle<_> = dag.add_task(task_fn::<(), _, _>(|_: ()| 42)).into();
// Create 100 tasks that all depend on source // Create 100 tasks that all depend on source
for i in 0..100 { for i in 0..100 {
dag.add_task(task_fn::<i32, _, _>(move |&x: &i32| { x + i })) dag.add_task(task_fn::<i32, _, _>(move |&x: &i32| x + i))
.depends_on(source); .depends_on(source);
} }
+3 -3
View File
@@ -14,7 +14,7 @@ pub fn bench_10k_breakdown(c: &mut Criterion) {
b.iter(|| { b.iter(|| {
let dag = DagRunner::new(); let dag = DagRunner::new();
for i in 0..10_000 { for i in 0..10_000 {
dag.add_task(task_fn::<(), _, _>(move |_: ()| { i })); dag.add_task(task_fn::<(), _, _>(move |_: ()| i));
} }
}); });
}); });
@@ -25,7 +25,7 @@ pub fn bench_10k_breakdown(c: &mut Criterion) {
rt.block_on(async { rt.block_on(async {
let dag = DagRunner::new(); let dag = DagRunner::new();
for i in 0..10_000 { for i in 0..10_000 {
dag.add_task(task_fn::<(), _, _>(move |_: ()| { i })); dag.add_task(task_fn::<(), _, _>(move |_: ()| i));
} }
dag.run(|fut| tokio::spawn(fut).map(Result::unwrap)) dag.run(|fut| tokio::spawn(fut).map(Result::unwrap))
.await .await
@@ -39,7 +39,7 @@ pub fn bench_10k_breakdown(c: &mut Criterion) {
// Pre-build the DAG outside the measurement // Pre-build the DAG outside the measurement
let dag = DagRunner::new(); let dag = DagRunner::new();
for i in 0..10_000 { for i in 0..10_000 {
dag.add_task(task_fn::<(), _, _>(move |_: ()| { i })); dag.add_task(task_fn::<(), _, _>(move |_: ()| i));
} }
b.iter(|| { b.iter(|| {
+1 -2
View File
@@ -113,11 +113,10 @@ async fn main() {
// Step 7: Retrieve results // Step 7: Retrieve results
// //
// Use .get() with a TaskHandle to retrieve the output. // Use .get() with a TaskHandle to retrieve the output.
// Results are cloned, so you can retrieve them multiple times. // Results are not cloned, so you can only retrieve them once.
println!("\nResult: {}", dag.get(sum).unwrap()); println!("\nResult: {}", dag.get(sum).unwrap());
// Note: You can also retrieve intermediate results // Note: You can also retrieve intermediate results
assert_eq!(dag.get(x).unwrap(), 2); assert_eq!(dag.get(x).unwrap(), 2);
assert_eq!(dag.get(y).unwrap(), 3); assert_eq!(dag.get(y).unwrap(), 3);
assert_eq!(dag.get(sum).unwrap(), 5);
} }
+12 -15
View File
@@ -17,7 +17,7 @@ async fn test_task_fn_creation_and_execution() {
// Test the Task trait implementation // Test the Task trait implementation
let result = task let result = task
.run(TaskInput::new( .run(TaskInput::new(
vec![Arc::new(42) as Arc<dyn Any + Send + Sync + 'static>].iter(), [Arc::new(42) as Arc<dyn Any + Send + Sync + 'static>].iter(),
)) ))
.await; .await;
assert_eq!(result, 84); assert_eq!(result, 84);
@@ -30,7 +30,7 @@ async fn test_task_fn_with_unit_input() {
let result = task let result = task
.run(TaskInput::new( .run(TaskInput::new(
vec![Arc::new(()) as Arc<dyn Any + Send + Sync + 'static>].iter(), [Arc::new(()) as Arc<dyn Any + Send + Sync + 'static>].iter(),
)) ))
.await; .await;
assert_eq!(result, 100); assert_eq!(result, 100);
@@ -43,7 +43,7 @@ async fn test_task_fn_with_tuple_input() {
let result = task let result = task
.run(TaskInput::new( .run(TaskInput::new(
vec![ [
Arc::new(10) as Arc<dyn Any + Send + Sync + 'static>, Arc::new(10) as Arc<dyn Any + Send + Sync + 'static>,
Arc::new(20) as Arc<dyn Any + Send + Sync + 'static>, Arc::new(20) as Arc<dyn Any + Send + Sync + 'static>,
] ]
@@ -56,15 +56,12 @@ async fn test_task_fn_with_tuple_input() {
#[tokio::test] #[tokio::test]
async fn test_task_fn_with_string_input() { async fn test_task_fn_with_string_input() {
// Test task_fn with String input // Test task_fn with String input
let task = task_fn::<String, _, _>(|input: &String| { let task = task_fn::<String, _, _>(|input: &String| input.len());
let len = input.len();
len
});
let test_string = String::from("hello"); let test_string = String::from("hello");
let result = task let result = task
.run(TaskInput::new( .run(TaskInput::new(
vec![Arc::new(test_string) as Arc<dyn Any + Send + Sync + 'static>].iter(), [Arc::new(test_string) as Arc<dyn Any + Send + Sync + 'static>].iter(),
)) ))
.await; .await;
assert_eq!(result, 5); assert_eq!(result, 5);
@@ -77,7 +74,7 @@ async fn test_task_fn_with_complex_output() {
let result = task let result = task
.run(TaskInput::new( .run(TaskInput::new(
vec![Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter(), [Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter(),
)) ))
.await; .await;
assert_eq!(result, vec![5, 10, 15]); assert_eq!(result, vec![5, 10, 15]);
@@ -91,7 +88,7 @@ async fn test_task_fn_stateful_closure() {
let result = task let result = task
.run(TaskInput::new( .run(TaskInput::new(
vec![Arc::new(7) as Arc<dyn Any + Send + Sync + 'static>].iter(), [Arc::new(7) as Arc<dyn Any + Send + Sync + 'static>].iter(),
)) ))
.await; .await;
assert_eq!(result, 21); assert_eq!(result, 21);
@@ -124,7 +121,7 @@ async fn test_custom_task_implementation() {
let result1 = task let result1 = task
.run(TaskInput::new( .run(TaskInput::new(
vec![Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter(), [Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter(),
)) ))
.await; .await;
assert_eq!(result1, 15); assert_eq!(result1, 15);
@@ -160,7 +157,7 @@ async fn test_task_fn_single_call() {
assert_eq!( assert_eq!(
task.run(TaskInput::new( task.run(TaskInput::new(
vec![Arc::new(1) as Arc<dyn Any + Send + Sync + 'static>].iter() [Arc::new(1) as Arc<dyn Any + Send + Sync + 'static>].iter()
)) ))
.await, .await,
2 2
@@ -180,7 +177,7 @@ async fn test_task_fn_with_result_type() {
assert_eq!( assert_eq!(
task.run(TaskInput::new( task.run(TaskInput::new(
vec![Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter() [Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter()
)) ))
.await, .await,
Ok(10) Ok(10)
@@ -194,7 +191,7 @@ async fn test_task_fn_with_option_type() {
assert_eq!( assert_eq!(
task.run(TaskInput::new( task.run(TaskInput::new(
vec![Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter() [Arc::new(5) as Arc<dyn Any + Send + Sync + 'static>].iter()
)) ))
.await, .await,
Some(10) Some(10)
@@ -210,7 +207,7 @@ async fn test_task_fn_explicit_trait_call() {
// Explicitly call the Task trait's run method // Explicitly call the Task trait's run method
let result = Task::run( let result = Task::run(
task, task,
TaskInput::new(vec![Arc::new(10) as Arc<dyn Any + Send + Sync + 'static>].iter()), TaskInput::new([Arc::new(10) as Arc<dyn Any + Send + Sync + 'static>].iter()),
) )
.await; .await;
assert_eq!(result, 30); assert_eq!(result, 30);