@@ -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,64 @@ 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+ // Benchmark fill
506+ for & ( size, name) in sizes {
507+ group. throughput ( Throughput :: Bytes ( size as u64 ) ) ;
508+ group. bench_with_input ( BenchmarkId :: new ( "fill" , name) , & size, |b, & size| {
509+ let eshm = ExclusiveSharedMemory :: new ( size) . unwrap ( ) ;
510+ let ( mut hshm, _) = eshm. build ( ) ;
511+ b. iter ( || {
512+ hshm. fill ( 0xAB , 0 , size) . unwrap ( ) ;
513+ } ) ;
514+ } ) ;
515+ }
516+
517+ // Benchmark copy_to_slice (read from shared memory)
518+ for & ( size, name) in sizes {
519+ group. throughput ( Throughput :: Bytes ( size as u64 ) ) ;
520+ group. bench_with_input (
521+ BenchmarkId :: new ( "copy_to_slice" , name) ,
522+ & size,
523+ |b, & size| {
524+ let eshm = ExclusiveSharedMemory :: new ( size) . unwrap ( ) ;
525+ let ( hshm, _) = eshm. build ( ) ;
526+ let mut dst = vec ! [ 0u8 ; size] ;
527+ b. iter ( || {
528+ hshm. copy_to_slice ( & mut dst, 0 ) . unwrap ( ) ;
529+ } ) ;
530+ } ,
531+ ) ;
532+ }
533+
534+ // Benchmark copy_from_slice (write to shared memory)
535+ for & ( size, name) in sizes {
536+ group. throughput ( Throughput :: Bytes ( size as u64 ) ) ;
537+ group. bench_with_input (
538+ BenchmarkId :: new ( "copy_from_slice" , name) ,
539+ & size,
540+ |b, & size| {
541+ let eshm = ExclusiveSharedMemory :: new ( size) . unwrap ( ) ;
542+ let ( hshm, _) = eshm. build ( ) ;
543+ let src = vec ! [ 0xCDu8 ; size] ;
544+ b. iter ( || {
545+ hshm. copy_from_slice ( & src, 0 ) . unwrap ( ) ;
546+ } ) ;
547+ } ,
548+ ) ;
549+ }
550+
551+ group. finish ( ) ;
552+ }
553+
495554criterion_group ! {
496555 name = benches;
497556 config = Criterion :: default ( ) ;
@@ -501,6 +560,7 @@ criterion_group! {
501560 snapshots_benchmark,
502561 guest_call_benchmark_large_param,
503562 function_call_serialization_benchmark,
504- sample_workloads_benchmark
563+ sample_workloads_benchmark,
564+ shared_memory_benchmark
505565}
506566criterion_main ! ( benches) ;
0 commit comments