11use criterion:: { Criterion , Throughput , criterion_group, criterion_main} ;
22use std:: hint:: black_box;
3- use wraith_core:: { FRAME_HEADER_SIZE , Frame , FrameBuilder , FrameType , build_into_from_parts} ;
3+ use wraith_core:: frame:: compat:: { v1_header_to_v2, v2_header_to_v1} ;
4+ use wraith_core:: {
5+ ConnectionId , ConnectionIdV2 , FRAME_HEADER_SIZE , FlagsV2 , FormatNegotiation , Frame ,
6+ FrameBuilder , FrameFlags , FrameHeaderV2 , FrameType , FrameTypeV2 , PolymorphicFormat ,
7+ build_into_from_parts, detect_format,
8+ } ;
49
510fn bench_frame_parse ( c : & mut Criterion ) {
611 let frame_data = FrameBuilder :: new ( )
@@ -340,6 +345,221 @@ fn bench_frame_build_into_from_parts(c: &mut Criterion) {
340345 group. finish ( ) ;
341346}
342347
348+ // ============================================================================
349+ // v2 Wire Format Benchmarks
350+ // ============================================================================
351+
352+ fn bench_connection_id_v2 ( c : & mut Criterion ) {
353+ let mut group = c. benchmark_group ( "connection_id_v2" ) ;
354+
355+ group. bench_function ( "generate" , |b| {
356+ b. iter ( || black_box ( ConnectionIdV2 :: generate ( ) ) )
357+ } ) ;
358+
359+ let v1 = ConnectionId :: from_bytes ( [ 0x12 , 0x34 , 0x56 , 0x78 , 0x9A , 0xBC , 0xDE , 0xF0 ] ) ;
360+ group. bench_function ( "from_v1" , |b| {
361+ b. iter ( || black_box ( ConnectionIdV2 :: from_v1 ( black_box ( v1) ) ) )
362+ } ) ;
363+
364+ let cid = ConnectionIdV2 :: from_bytes ( [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ] ) ;
365+ group. bench_function ( "rotate" , |b| {
366+ b. iter ( || black_box ( black_box ( cid) . rotate ( black_box ( 0x1111111111111111u64 ) ) ) )
367+ } ) ;
368+
369+ group. bench_function ( "write_read_roundtrip" , |b| {
370+ let cid = ConnectionIdV2 :: generate ( ) ;
371+ let mut buf = [ 0u8 ; 16 ] ;
372+ b. iter ( || {
373+ black_box ( cid) . write_to ( black_box ( & mut buf) ) ;
374+ black_box ( ConnectionIdV2 :: read_from ( black_box ( & buf) ) )
375+ } )
376+ } ) ;
377+
378+ group. bench_function ( "is_valid" , |b| {
379+ b. iter ( || black_box ( black_box ( cid) . is_valid ( ) ) )
380+ } ) ;
381+
382+ group. bench_function ( "is_migrated_v1" , |b| {
383+ let migrated = ConnectionIdV2 :: from_v1 ( v1) ;
384+ b. iter ( || black_box ( black_box ( migrated) . is_migrated_v1 ( ) ) )
385+ } ) ;
386+
387+ group. finish ( ) ;
388+ }
389+
390+ fn test_header_v2 ( ) -> FrameHeaderV2 {
391+ FrameHeaderV2 {
392+ version : 0x20 ,
393+ frame_type : FrameTypeV2 :: StreamData ,
394+ flags : FlagsV2 :: empty ( ) . with ( FlagsV2 :: SYN ) . with ( FlagsV2 :: ECN ) ,
395+ sequence : 0x0123_4567_89AB_CDEF ,
396+ length : 1400 ,
397+ stream_id : 42 ,
398+ reserved : 0 ,
399+ }
400+ }
401+
402+ fn bench_header_v2 ( c : & mut Criterion ) {
403+ let mut group = c. benchmark_group ( "header_v2" ) ;
404+ group. throughput ( Throughput :: Bytes ( 24 ) ) ;
405+
406+ let header = test_header_v2 ( ) ;
407+
408+ group. bench_function ( "encode" , |b| {
409+ b. iter ( || black_box ( black_box ( header) . encode ( ) ) )
410+ } ) ;
411+
412+ let encoded = header. encode ( ) ;
413+ group. bench_function ( "decode" , |b| {
414+ b. iter ( || FrameHeaderV2 :: decode ( black_box ( & encoded) ) )
415+ } ) ;
416+
417+ #[ cfg( feature = "simd" ) ]
418+ group. bench_function ( "decode_simd" , |b| {
419+ b. iter ( || FrameHeaderV2 :: decode_simd ( black_box ( & encoded) ) )
420+ } ) ;
421+
422+ group. bench_function ( "roundtrip" , |b| {
423+ b. iter ( || {
424+ let enc = black_box ( header) . encode ( ) ;
425+ black_box ( FrameHeaderV2 :: decode ( black_box ( & enc) ) )
426+ } )
427+ } ) ;
428+
429+ group. bench_function ( "encode_into" , |b| {
430+ let mut buf = [ 0u8 ; 24 ] ;
431+ b. iter ( || header. encode_into ( black_box ( & mut buf) ) )
432+ } ) ;
433+
434+ group. bench_function ( "new" , |b| {
435+ b. iter ( || black_box ( FrameHeaderV2 :: new ( black_box ( FrameTypeV2 :: Data ) ) ) )
436+ } ) ;
437+
438+ group. finish ( ) ;
439+ }
440+
441+ fn bench_polymorphic ( c : & mut Criterion ) {
442+ let mut group = c. benchmark_group ( "polymorphic" ) ;
443+ let secret = [ 0x42u8 ; 32 ] ;
444+
445+ group. bench_function ( "derive" , |b| {
446+ b. iter ( || black_box ( PolymorphicFormat :: derive ( black_box ( & secret) ) ) )
447+ } ) ;
448+
449+ let fmt = PolymorphicFormat :: derive ( & secret) ;
450+ let header = test_header_v2 ( ) ;
451+
452+ group. throughput ( Throughput :: Bytes ( 24 ) ) ;
453+
454+ group. bench_function ( "encode_header" , |b| {
455+ b. iter ( || black_box ( fmt. encode_header ( black_box ( & header) ) ) )
456+ } ) ;
457+
458+ let encoded = fmt. encode_header ( & header) ;
459+ group. bench_function ( "decode_header" , |b| {
460+ b. iter ( || fmt. decode_header ( black_box ( & encoded) ) )
461+ } ) ;
462+
463+ group. bench_function ( "roundtrip" , |b| {
464+ b. iter ( || {
465+ let enc = fmt. encode_header ( black_box ( & header) ) ;
466+ black_box ( fmt. decode_header ( black_box ( & enc) ) )
467+ } )
468+ } ) ;
469+
470+ group. finish ( ) ;
471+ }
472+
473+ fn bench_compat ( c : & mut Criterion ) {
474+ let mut group = c. benchmark_group ( "compat" ) ;
475+
476+ // detect_format with v2 data
477+ let v2_data = test_header_v2 ( ) . encode ( ) ;
478+ group. bench_function ( "detect_format_v2" , |b| {
479+ b. iter ( || black_box ( detect_format ( black_box ( & v2_data) ) ) )
480+ } ) ;
481+
482+ // detect_format with v1 data
483+ let mut v1_data = vec ! [ 0u8 ; 28 ] ;
484+ v1_data[ 8 ] = 0x01 ; // Data frame type for v1
485+ group. bench_function ( "detect_format_v1" , |b| {
486+ b. iter ( || black_box ( detect_format ( black_box ( & v1_data) ) ) )
487+ } ) ;
488+
489+ // v1_header_to_v2
490+ let v1_header = wraith_core:: frame:: FrameHeader {
491+ frame_type : FrameType :: Data ,
492+ flags : FrameFlags :: new ( ) . with_syn ( ) ,
493+ stream_id : 42 ,
494+ sequence : 1000 ,
495+ offset : 8192 ,
496+ payload_len : 1400 ,
497+ } ;
498+ group. bench_function ( "v1_header_to_v2" , |b| {
499+ b. iter ( || black_box ( v1_header_to_v2 ( black_box ( & v1_header) ) ) )
500+ } ) ;
501+
502+ // v2_header_to_v1
503+ let v2_header = test_header_v2 ( ) ;
504+ group. bench_function ( "v2_header_to_v1" , |b| {
505+ b. iter ( || black_box ( v2_header_to_v1 ( black_box ( & v2_header) ) ) )
506+ } ) ;
507+
508+ // FormatNegotiation
509+ let local = FormatNegotiation :: default ( ) ;
510+ let remote = FormatNegotiation :: default ( ) ;
511+ group. bench_function ( "negotiate" , |b| {
512+ b. iter ( || black_box ( black_box ( local) . negotiate ( black_box ( & remote) ) ) )
513+ } ) ;
514+
515+ group. finish ( ) ;
516+ }
517+
518+ fn bench_frame_type_v2 ( c : & mut Criterion ) {
519+ let mut group = c. benchmark_group ( "frame_type_v2" ) ;
520+
521+ group. bench_function ( "try_from_valid" , |b| {
522+ b. iter ( || FrameTypeV2 :: try_from ( black_box ( 0x31u8 ) ) ) // StreamData
523+ } ) ;
524+
525+ group. bench_function ( "try_from_invalid" , |b| {
526+ b. iter ( || FrameTypeV2 :: try_from ( black_box ( 0xFFu8 ) ) )
527+ } ) ;
528+
529+ group. bench_function ( "is_valid_byte" , |b| {
530+ b. iter ( || FrameTypeV2 :: is_valid_byte ( black_box ( 0x31u8 ) ) )
531+ } ) ;
532+
533+ group. bench_function ( "category" , |b| {
534+ let ft = FrameTypeV2 :: StreamData ;
535+ b. iter ( || black_box ( black_box ( ft) . category ( ) ) )
536+ } ) ;
537+
538+ group. bench_function ( "is_data" , |b| {
539+ let ft = FrameTypeV2 :: Data ;
540+ b. iter ( || black_box ( black_box ( ft) . is_data ( ) ) )
541+ } ) ;
542+
543+ // FlagsV2 operations
544+ group. bench_function ( "flags_with" , |b| {
545+ b. iter ( || {
546+ black_box (
547+ FlagsV2 :: empty ( )
548+ . with ( FlagsV2 :: SYN )
549+ . with ( FlagsV2 :: ECN )
550+ . with ( FlagsV2 :: CMP ) ,
551+ )
552+ } )
553+ } ) ;
554+
555+ group. bench_function ( "flags_contains" , |b| {
556+ let flags = FlagsV2 :: from_bits ( 0x00FF ) ;
557+ b. iter ( || black_box ( black_box ( flags) . contains ( black_box ( FlagsV2 :: ECN ) ) ) )
558+ } ) ;
559+
560+ group. finish ( ) ;
561+ }
562+
343563criterion_group ! (
344564 benches,
345565 bench_frame_parse,
@@ -355,4 +575,14 @@ criterion_group!(
355575 bench_frame_build_into_from_parts,
356576 bench_frame_full_pipeline
357577) ;
358- criterion_main ! ( benches) ;
578+
579+ criterion_group ! (
580+ v2_benches,
581+ bench_connection_id_v2,
582+ bench_header_v2,
583+ bench_polymorphic,
584+ bench_compat,
585+ bench_frame_type_v2
586+ ) ;
587+
588+ criterion_main ! ( benches, v2_benches) ;
0 commit comments