1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122


#![allow(unused_imports)]
use {
    fidl::{
        encoding::{Context, Decodable, Decoder, Encoder, with_tls_encode_buf, WireFormatVersion},
        handle::Handle, handle::HandleDisposition, handle::HandleInfo, handle::HandleOp,
        ObjectType, Rights,
    },
    fidl_test_benchmarkfidlstructfield as test_benchmarkfidlstructfield,
    fuchsia_async as fasync,
    fuchsia_criterion::criterion::{BatchSize, Bencher, black_box},
    futures::{future, stream::StreamExt},
    fuchsia_zircon as zx,
    gidl_util::{HandleDef, HandleSubtype, copy_handle, create_handles, select_handle_infos},
    std::mem::ManuallyDrop
};

// BENCHMARKS is aggregated by a generated benchmark_suite.rs file, which is ultimately
// used in benchmarks in src/tests/benchmarks/fidl/rust/src/main.rs.
pub const BENCHMARKS: [(&'static str, fn(&mut Bencher)); 6] = [
    ("Builder/StructField/16", benchmark_struct_field_16_builder),
    ("Encode/StructField/16", benchmark_struct_field_16_encode),
    ("Decode/StructField/16", benchmark_struct_field_16_decode),
    
    ("Builder/StructField/256", benchmark_struct_field_256_builder),
    ("Encode/StructField/256", benchmark_struct_field_256_encode),
    ("Decode/StructField/256", benchmark_struct_field_256_decode),
    
];

const _V2_CONTEXT: &Context = &Context { wire_format_version: WireFormatVersion::V2 };


fn benchmark_struct_field_16_builder(b: &mut Bencher) {
    b.iter(
        || {
            black_box(test_benchmarkfidlstructfield::StructField16 { field1: 0u8, field2: 1u8, field3: 2u8, field4: 3u8, field5: 4u8, field6: 5u8, field7: 6u8, field8: 7u8, field9: 8u8, field10: 9u8, field11: 10u8, field12: 11u8, field13: 12u8, field14: 13u8, field15: 14u8, field16: 15u8 });
        },
    );
}

fn benchmark_struct_field_16_encode(b: &mut Bencher) {
    b.iter_batched_ref(
        || {
            test_benchmarkfidlstructfield::StructField16 { field1: 0u8, field2: 1u8, field3: 2u8, field4: 3u8, field5: 4u8, field6: 5u8, field7: 6u8, field8: 7u8, field9: 8u8, field10: 9u8, field11: 10u8, field12: 11u8, field13: 12u8, field14: 13u8, field15: 14u8, field16: 15u8 }
        },
        |value| {
            with_tls_encode_buf(|bytes, handles| {
                Encoder::encode_with_context(_V2_CONTEXT, bytes, handles, value).unwrap();
            })
        },
        BatchSize::SmallInput,
    );
}

fn benchmark_struct_field_16_decode(b: &mut Bencher) {
    b.iter_batched_ref(
        || {
            let mut bytes = Vec::<u8>::new();
            let mut handles = Vec::<HandleDisposition<'static>>::new();
            let original_value = &mut test_benchmarkfidlstructfield::StructField16 { field1: 0u8, field2: 1u8, field3: 2u8, field4: 3u8, field5: 4u8, field6: 5u8, field7: 6u8, field8: 7u8, field9: 8u8, field10: 9u8, field11: 10u8, field12: 11u8, field13: 12u8, field14: 13u8, field15: 14u8, field16: 15u8 };
            Encoder::encode_with_context(_V2_CONTEXT, &mut bytes, &mut handles, original_value).unwrap();
            let handle_infos = fidl::encoding::convert_handle_dispositions_to_infos(handles).unwrap();
            (bytes, handle_infos, ManuallyDrop::new(test_benchmarkfidlstructfield::StructField16::new_empty()))
        },
        |(bytes, handle_infos, manually_drop_value)| {
            // Cast &mut ManuallyDrop<T> to &mut T.
            let value : &mut test_benchmarkfidlstructfield::StructField16 = unsafe { std::mem::transmute(manually_drop_value as *mut _) };
            Decoder::decode_with_context(_V2_CONTEXT, bytes, handle_infos, value).unwrap();
            // Count the drop time in the benchmark.
            unsafe { ManuallyDrop::drop(manually_drop_value) };
        },
        BatchSize::SmallInput,
    );
}


fn benchmark_struct_field_256_builder(b: &mut Bencher) {
    b.iter(
        || {
            black_box(test_benchmarkfidlstructfield::StructField256 { field1: 0u8, field2: 1u8, field3: 2u8, field4: 3u8, field5: 4u8, field6: 5u8, field7: 6u8, field8: 7u8, field9: 8u8, field10: 9u8, field11: 10u8, field12: 11u8, field13: 12u8, field14: 13u8, field15: 14u8, field16: 15u8, field17: 16u8, field18: 17u8, field19: 18u8, field20: 19u8, field21: 20u8, field22: 21u8, field23: 22u8, field24: 23u8, field25: 24u8, field26: 25u8, field27: 26u8, field28: 27u8, field29: 28u8, field30: 29u8, field31: 30u8, field32: 31u8, field33: 32u8, field34: 33u8, field35: 34u8, field36: 35u8, field37: 36u8, field38: 37u8, field39: 38u8, field40: 39u8, field41: 40u8, field42: 41u8, field43: 42u8, field44: 43u8, field45: 44u8, field46: 45u8, field47: 46u8, field48: 47u8, field49: 48u8, field50: 49u8, field51: 50u8, field52: 51u8, field53: 52u8, field54: 53u8, field55: 54u8, field56: 55u8, field57: 56u8, field58: 57u8, field59: 58u8, field60: 59u8, field61: 60u8, field62: 61u8, field63: 62u8, field64: 63u8, field65: 64u8, field66: 65u8, field67: 66u8, field68: 67u8, field69: 68u8, field70: 69u8, field71: 70u8, field72: 71u8, field73: 72u8, field74: 73u8, field75: 74u8, field76: 75u8, field77: 76u8, field78: 77u8, field79: 78u8, field80: 79u8, field81: 80u8, field82: 81u8, field83: 82u8, field84: 83u8, field85: 84u8, field86: 85u8, field87: 86u8, field88: 87u8, field89: 88u8, field90: 89u8, field91: 90u8, field92: 91u8, field93: 92u8, field94: 93u8, field95: 94u8, field96: 95u8, field97: 96u8, field98: 97u8, field99: 98u8, field100: 99u8, field101: 100u8, field102: 101u8, field103: 102u8, field104: 103u8, field105: 104u8, field106: 105u8, field107: 106u8, field108: 107u8, field109: 108u8, field110: 109u8, field111: 110u8, field112: 111u8, field113: 112u8, field114: 113u8, field115: 114u8, field116: 115u8, field117: 116u8, field118: 117u8, field119: 118u8, field120: 119u8, field121: 120u8, field122: 121u8, field123: 122u8, field124: 123u8, field125: 124u8, field126: 125u8, field127: 126u8, field128: 127u8, field129: 128u8, field130: 129u8, field131: 130u8, field132: 131u8, field133: 132u8, field134: 133u8, field135: 134u8, field136: 135u8, field137: 136u8, field138: 137u8, field139: 138u8, field140: 139u8, field141: 140u8, field142: 141u8, field143: 142u8, field144: 143u8, field145: 144u8, field146: 145u8, field147: 146u8, field148: 147u8, field149: 148u8, field150: 149u8, field151: 150u8, field152: 151u8, field153: 152u8, field154: 153u8, field155: 154u8, field156: 155u8, field157: 156u8, field158: 157u8, field159: 158u8, field160: 159u8, field161: 160u8, field162: 161u8, field163: 162u8, field164: 163u8, field165: 164u8, field166: 165u8, field167: 166u8, field168: 167u8, field169: 168u8, field170: 169u8, field171: 170u8, field172: 171u8, field173: 172u8, field174: 173u8, field175: 174u8, field176: 175u8, field177: 176u8, field178: 177u8, field179: 178u8, field180: 179u8, field181: 180u8, field182: 181u8, field183: 182u8, field184: 183u8, field185: 184u8, field186: 185u8, field187: 186u8, field188: 187u8, field189: 188u8, field190: 189u8, field191: 190u8, field192: 191u8, field193: 192u8, field194: 193u8, field195: 194u8, field196: 195u8, field197: 196u8, field198: 197u8, field199: 198u8, field200: 199u8, field201: 200u8, field202: 201u8, field203: 202u8, field204: 203u8, field205: 204u8, field206: 205u8, field207: 206u8, field208: 207u8, field209: 208u8, field210: 209u8, field211: 210u8, field212: 211u8, field213: 212u8, field214: 213u8, field215: 214u8, field216: 215u8, field217: 216u8, field218: 217u8, field219: 218u8, field220: 219u8, field221: 220u8, field222: 221u8, field223: 222u8, field224: 223u8, field225: 224u8, field226: 225u8, field227: 226u8, field228: 227u8, field229: 228u8, field230: 229u8, field231: 230u8, field232: 231u8, field233: 232u8, field234: 233u8, field235: 234u8, field236: 235u8, field237: 236u8, field238: 237u8, field239: 238u8, field240: 239u8, field241: 240u8, field242: 241u8, field243: 242u8, field244: 243u8, field245: 244u8, field246: 245u8, field247: 246u8, field248: 247u8, field249: 248u8, field250: 249u8, field251: 250u8, field252: 251u8, field253: 252u8, field254: 253u8, field255: 254u8, field256: 255u8 });
        },
    );
}

fn benchmark_struct_field_256_encode(b: &mut Bencher) {
    b.iter_batched_ref(
        || {
            test_benchmarkfidlstructfield::StructField256 { field1: 0u8, field2: 1u8, field3: 2u8, field4: 3u8, field5: 4u8, field6: 5u8, field7: 6u8, field8: 7u8, field9: 8u8, field10: 9u8, field11: 10u8, field12: 11u8, field13: 12u8, field14: 13u8, field15: 14u8, field16: 15u8, field17: 16u8, field18: 17u8, field19: 18u8, field20: 19u8, field21: 20u8, field22: 21u8, field23: 22u8, field24: 23u8, field25: 24u8, field26: 25u8, field27: 26u8, field28: 27u8, field29: 28u8, field30: 29u8, field31: 30u8, field32: 31u8, field33: 32u8, field34: 33u8, field35: 34u8, field36: 35u8, field37: 36u8, field38: 37u8, field39: 38u8, field40: 39u8, field41: 40u8, field42: 41u8, field43: 42u8, field44: 43u8, field45: 44u8, field46: 45u8, field47: 46u8, field48: 47u8, field49: 48u8, field50: 49u8, field51: 50u8, field52: 51u8, field53: 52u8, field54: 53u8, field55: 54u8, field56: 55u8, field57: 56u8, field58: 57u8, field59: 58u8, field60: 59u8, field61: 60u8, field62: 61u8, field63: 62u8, field64: 63u8, field65: 64u8, field66: 65u8, field67: 66u8, field68: 67u8, field69: 68u8, field70: 69u8, field71: 70u8, field72: 71u8, field73: 72u8, field74: 73u8, field75: 74u8, field76: 75u8, field77: 76u8, field78: 77u8, field79: 78u8, field80: 79u8, field81: 80u8, field82: 81u8, field83: 82u8, field84: 83u8, field85: 84u8, field86: 85u8, field87: 86u8, field88: 87u8, field89: 88u8, field90: 89u8, field91: 90u8, field92: 91u8, field93: 92u8, field94: 93u8, field95: 94u8, field96: 95u8, field97: 96u8, field98: 97u8, field99: 98u8, field100: 99u8, field101: 100u8, field102: 101u8, field103: 102u8, field104: 103u8, field105: 104u8, field106: 105u8, field107: 106u8, field108: 107u8, field109: 108u8, field110: 109u8, field111: 110u8, field112: 111u8, field113: 112u8, field114: 113u8, field115: 114u8, field116: 115u8, field117: 116u8, field118: 117u8, field119: 118u8, field120: 119u8, field121: 120u8, field122: 121u8, field123: 122u8, field124: 123u8, field125: 124u8, field126: 125u8, field127: 126u8, field128: 127u8, field129: 128u8, field130: 129u8, field131: 130u8, field132: 131u8, field133: 132u8, field134: 133u8, field135: 134u8, field136: 135u8, field137: 136u8, field138: 137u8, field139: 138u8, field140: 139u8, field141: 140u8, field142: 141u8, field143: 142u8, field144: 143u8, field145: 144u8, field146: 145u8, field147: 146u8, field148: 147u8, field149: 148u8, field150: 149u8, field151: 150u8, field152: 151u8, field153: 152u8, field154: 153u8, field155: 154u8, field156: 155u8, field157: 156u8, field158: 157u8, field159: 158u8, field160: 159u8, field161: 160u8, field162: 161u8, field163: 162u8, field164: 163u8, field165: 164u8, field166: 165u8, field167: 166u8, field168: 167u8, field169: 168u8, field170: 169u8, field171: 170u8, field172: 171u8, field173: 172u8, field174: 173u8, field175: 174u8, field176: 175u8, field177: 176u8, field178: 177u8, field179: 178u8, field180: 179u8, field181: 180u8, field182: 181u8, field183: 182u8, field184: 183u8, field185: 184u8, field186: 185u8, field187: 186u8, field188: 187u8, field189: 188u8, field190: 189u8, field191: 190u8, field192: 191u8, field193: 192u8, field194: 193u8, field195: 194u8, field196: 195u8, field197: 196u8, field198: 197u8, field199: 198u8, field200: 199u8, field201: 200u8, field202: 201u8, field203: 202u8, field204: 203u8, field205: 204u8, field206: 205u8, field207: 206u8, field208: 207u8, field209: 208u8, field210: 209u8, field211: 210u8, field212: 211u8, field213: 212u8, field214: 213u8, field215: 214u8, field216: 215u8, field217: 216u8, field218: 217u8, field219: 218u8, field220: 219u8, field221: 220u8, field222: 221u8, field223: 222u8, field224: 223u8, field225: 224u8, field226: 225u8, field227: 226u8, field228: 227u8, field229: 228u8, field230: 229u8, field231: 230u8, field232: 231u8, field233: 232u8, field234: 233u8, field235: 234u8, field236: 235u8, field237: 236u8, field238: 237u8, field239: 238u8, field240: 239u8, field241: 240u8, field242: 241u8, field243: 242u8, field244: 243u8, field245: 244u8, field246: 245u8, field247: 246u8, field248: 247u8, field249: 248u8, field250: 249u8, field251: 250u8, field252: 251u8, field253: 252u8, field254: 253u8, field255: 254u8, field256: 255u8 }
        },
        |value| {
            with_tls_encode_buf(|bytes, handles| {
                Encoder::encode_with_context(_V2_CONTEXT, bytes, handles, value).unwrap();
            })
        },
        BatchSize::SmallInput,
    );
}

fn benchmark_struct_field_256_decode(b: &mut Bencher) {
    b.iter_batched_ref(
        || {
            let mut bytes = Vec::<u8>::new();
            let mut handles = Vec::<HandleDisposition<'static>>::new();
            let original_value = &mut test_benchmarkfidlstructfield::StructField256 { field1: 0u8, field2: 1u8, field3: 2u8, field4: 3u8, field5: 4u8, field6: 5u8, field7: 6u8, field8: 7u8, field9: 8u8, field10: 9u8, field11: 10u8, field12: 11u8, field13: 12u8, field14: 13u8, field15: 14u8, field16: 15u8, field17: 16u8, field18: 17u8, field19: 18u8, field20: 19u8, field21: 20u8, field22: 21u8, field23: 22u8, field24: 23u8, field25: 24u8, field26: 25u8, field27: 26u8, field28: 27u8, field29: 28u8, field30: 29u8, field31: 30u8, field32: 31u8, field33: 32u8, field34: 33u8, field35: 34u8, field36: 35u8, field37: 36u8, field38: 37u8, field39: 38u8, field40: 39u8, field41: 40u8, field42: 41u8, field43: 42u8, field44: 43u8, field45: 44u8, field46: 45u8, field47: 46u8, field48: 47u8, field49: 48u8, field50: 49u8, field51: 50u8, field52: 51u8, field53: 52u8, field54: 53u8, field55: 54u8, field56: 55u8, field57: 56u8, field58: 57u8, field59: 58u8, field60: 59u8, field61: 60u8, field62: 61u8, field63: 62u8, field64: 63u8, field65: 64u8, field66: 65u8, field67: 66u8, field68: 67u8, field69: 68u8, field70: 69u8, field71: 70u8, field72: 71u8, field73: 72u8, field74: 73u8, field75: 74u8, field76: 75u8, field77: 76u8, field78: 77u8, field79: 78u8, field80: 79u8, field81: 80u8, field82: 81u8, field83: 82u8, field84: 83u8, field85: 84u8, field86: 85u8, field87: 86u8, field88: 87u8, field89: 88u8, field90: 89u8, field91: 90u8, field92: 91u8, field93: 92u8, field94: 93u8, field95: 94u8, field96: 95u8, field97: 96u8, field98: 97u8, field99: 98u8, field100: 99u8, field101: 100u8, field102: 101u8, field103: 102u8, field104: 103u8, field105: 104u8, field106: 105u8, field107: 106u8, field108: 107u8, field109: 108u8, field110: 109u8, field111: 110u8, field112: 111u8, field113: 112u8, field114: 113u8, field115: 114u8, field116: 115u8, field117: 116u8, field118: 117u8, field119: 118u8, field120: 119u8, field121: 120u8, field122: 121u8, field123: 122u8, field124: 123u8, field125: 124u8, field126: 125u8, field127: 126u8, field128: 127u8, field129: 128u8, field130: 129u8, field131: 130u8, field132: 131u8, field133: 132u8, field134: 133u8, field135: 134u8, field136: 135u8, field137: 136u8, field138: 137u8, field139: 138u8, field140: 139u8, field141: 140u8, field142: 141u8, field143: 142u8, field144: 143u8, field145: 144u8, field146: 145u8, field147: 146u8, field148: 147u8, field149: 148u8, field150: 149u8, field151: 150u8, field152: 151u8, field153: 152u8, field154: 153u8, field155: 154u8, field156: 155u8, field157: 156u8, field158: 157u8, field159: 158u8, field160: 159u8, field161: 160u8, field162: 161u8, field163: 162u8, field164: 163u8, field165: 164u8, field166: 165u8, field167: 166u8, field168: 167u8, field169: 168u8, field170: 169u8, field171: 170u8, field172: 171u8, field173: 172u8, field174: 173u8, field175: 174u8, field176: 175u8, field177: 176u8, field178: 177u8, field179: 178u8, field180: 179u8, field181: 180u8, field182: 181u8, field183: 182u8, field184: 183u8, field185: 184u8, field186: 185u8, field187: 186u8, field188: 187u8, field189: 188u8, field190: 189u8, field191: 190u8, field192: 191u8, field193: 192u8, field194: 193u8, field195: 194u8, field196: 195u8, field197: 196u8, field198: 197u8, field199: 198u8, field200: 199u8, field201: 200u8, field202: 201u8, field203: 202u8, field204: 203u8, field205: 204u8, field206: 205u8, field207: 206u8, field208: 207u8, field209: 208u8, field210: 209u8, field211: 210u8, field212: 211u8, field213: 212u8, field214: 213u8, field215: 214u8, field216: 215u8, field217: 216u8, field218: 217u8, field219: 218u8, field220: 219u8, field221: 220u8, field222: 221u8, field223: 222u8, field224: 223u8, field225: 224u8, field226: 225u8, field227: 226u8, field228: 227u8, field229: 228u8, field230: 229u8, field231: 230u8, field232: 231u8, field233: 232u8, field234: 233u8, field235: 234u8, field236: 235u8, field237: 236u8, field238: 237u8, field239: 238u8, field240: 239u8, field241: 240u8, field242: 241u8, field243: 242u8, field244: 243u8, field245: 244u8, field246: 245u8, field247: 246u8, field248: 247u8, field249: 248u8, field250: 249u8, field251: 250u8, field252: 251u8, field253: 252u8, field254: 253u8, field255: 254u8, field256: 255u8 };
            Encoder::encode_with_context(_V2_CONTEXT, &mut bytes, &mut handles, original_value).unwrap();
            let handle_infos = fidl::encoding::convert_handle_dispositions_to_infos(handles).unwrap();
            (bytes, handle_infos, ManuallyDrop::new(test_benchmarkfidlstructfield::StructField256::new_empty()))
        },
        |(bytes, handle_infos, manually_drop_value)| {
            // Cast &mut ManuallyDrop<T> to &mut T.
            let value : &mut test_benchmarkfidlstructfield::StructField256 = unsafe { std::mem::transmute(manually_drop_value as *mut _) };
            Decoder::decode_with_context(_V2_CONTEXT, bytes, handle_infos, value).unwrap();
            // Count the drop time in the benchmark.
            unsafe { ManuallyDrop::drop(manually_drop_value) };
        },
        BatchSize::SmallInput,
    );
}