@@ -23,12 +23,13 @@ use std::sync::{Arc, Barrier, Mutex};
2323use std:: thread;
2424use std:: time:: { Duration , Instant } ;
2525
26- use criterion:: { Criterion , criterion_group, criterion_main} ;
26+ use criterion:: { BenchmarkId , Criterion , Throughput , criterion_group, criterion_main} ;
2727use flatbuffers:: FlatBufferBuilder ;
2828use hyperlight_common:: flatbuffer_wrappers:: function_call:: { FunctionCall , FunctionCallType } ;
2929use hyperlight_common:: flatbuffer_wrappers:: function_types:: { ParameterValue , ReturnType } ;
3030use hyperlight_common:: flatbuffer_wrappers:: util:: estimate_flatbuffer_capacity;
3131use hyperlight_host:: GuestBinary ;
32+ use hyperlight_host:: mem:: shared_mem:: ExclusiveSharedMemory ;
3233use hyperlight_host:: sandbox:: { MultiUseSandbox , SandboxConfiguration , UninitializedSandbox } ;
3334use hyperlight_testing:: sandbox_sizes:: { LARGE_HEAP_SIZE , MEDIUM_HEAP_SIZE , SMALL_HEAP_SIZE } ;
3435use hyperlight_testing:: { c_simple_guest_as_string, simple_guest_as_string} ;
@@ -492,6 +493,59 @@ fn sample_workloads_benchmark(c: &mut Criterion) {
492493 group. finish ( ) ;
493494}
494495
496+ // ============================================================================
497+ // Benchmark Category: Shared Memory Operations
498+ // ============================================================================
499+
500+ fn shared_memory_benchmark ( c : & mut Criterion ) {
501+ let mut group = c. benchmark_group ( "shared_memory" ) ;
502+
503+ let sizes: & [ ( usize , & str ) ] = & [ ( 1024 * 1024 , "1MB" ) , ( 64 * 1024 * 1024 , "64MB" ) ] ;
504+
505+ for & ( size, name) in sizes {
506+ group. throughput ( Throughput :: Bytes ( size as u64 ) ) ;
507+
508+ // Benchmark fill
509+ group. bench_with_input ( BenchmarkId :: new ( "fill" , name) , & size, |b, & size| {
510+ let eshm = ExclusiveSharedMemory :: new ( size) . unwrap ( ) ;
511+ let ( mut hshm, _) = eshm. build ( ) ;
512+ b. iter ( || {
513+ hshm. fill ( 0xAB , 0 , size) . unwrap ( ) ;
514+ } ) ;
515+ } ) ;
516+
517+ // Benchmark copy_to_slice (read from shared memory)
518+ group. bench_with_input (
519+ BenchmarkId :: new ( "copy_to_slice" , name) ,
520+ & size,
521+ |b, & size| {
522+ let eshm = ExclusiveSharedMemory :: new ( size) . unwrap ( ) ;
523+ let ( hshm, _) = eshm. build ( ) ;
524+ let mut dst = vec ! [ 0u8 ; size] ;
525+ b. iter ( || {
526+ hshm. copy_to_slice ( & mut dst, 0 ) . unwrap ( ) ;
527+ } ) ;
528+ } ,
529+ ) ;
530+
531+ // Benchmark copy_from_slice (write to shared memory)
532+ group. bench_with_input (
533+ BenchmarkId :: new ( "copy_from_slice" , name) ,
534+ & size,
535+ |b, & size| {
536+ let eshm = ExclusiveSharedMemory :: new ( size) . unwrap ( ) ;
537+ let ( hshm, _) = eshm. build ( ) ;
538+ let src = vec ! [ 0xCDu8 ; size] ;
539+ b. iter ( || {
540+ hshm. copy_from_slice ( & src, 0 ) . unwrap ( ) ;
541+ } ) ;
542+ } ,
543+ ) ;
544+ }
545+
546+ group. finish ( ) ;
547+ }
548+
495549criterion_group ! {
496550 name = benches;
497551 config = Criterion :: default ( ) ;
@@ -501,6 +555,7 @@ criterion_group! {
501555 snapshots_benchmark,
502556 guest_call_benchmark_large_param,
503557 function_call_serialization_benchmark,
504- sample_workloads_benchmark
558+ sample_workloads_benchmark,
559+ shared_memory_benchmark
505560}
506561criterion_main ! ( benches) ;
0 commit comments