Skip to content

Instantly share code, notes, and snippets.

@zamazan4ik
Created April 23, 2024 14:59
Show Gist options
  • Save zamazan4ik/32b33157c2a3d2c855530be38beb45bf to your computer and use it in GitHub Desktop.
Save zamazan4ik/32b33157c2a3d2c855530be38beb45bf to your computer and use it in GitHub Desktop.
prost: PGO-instrumented compared to Release
cargo pgo bench -- --workspace
[2024-04-23T14:43:03Z INFO cargo_pgo::pgo::instrument] PGO profile directory will be cleared.
[2024-04-23T14:43:03Z INFO cargo_pgo::pgo::instrument] PGO profiles will be stored into /home/zamazan4ik/open_source/prost/target/pgo-profiles.
Compiling serde_json v1.0.116
Compiling ciborium v0.2.2
Compiling protobuf v0.0.0 (/home/zamazan4ik/open_source/prost/protobuf)
Compiling single_include v0.1.0 (/home/zamazan4ik/open_source/prost/tests/single-include)
Compiling tinytemplate v1.2.1
Compiling criterion v0.4.0
Compiling tests v0.0.0 (/home/zamazan4ik/open_source/prost/tests)
Compiling tests-2015 v0.0.0 (/home/zamazan4ik/open_source/prost/tests-2015)
Compiling tests-no-std v0.0.0 (/home/zamazan4ik/open_source/prost/tests-no-std)
Compiling prost v0.12.4 (/home/zamazan4ik/open_source/prost/prost)
Compiling conformance v0.0.0 (/home/zamazan4ik/open_source/prost/conformance)
Finished bench [optimized + debuginfo] target(s) in 12.88s
[2024-04-23T14:43:16Z INFO cargo_pgo::pgo::instrument] PGO instrumentation build finished successfully.
Running unittests src/main.rs (x86_64-unknown-linux-gnu/release/deps/conformance-92d13a27232bb11d)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running benches/varint.rs (x86_64-unknown-linux-gnu/release/deps/varint-5fe22ce78713329d)
Benchmarking varint/small/encode
Benchmarking varint/small/encode: Warming up for 3.0000 s
Benchmarking varint/small/encode: Collecting 100 samples in estimated 5.0005 s (6.7M iterations)
Benchmarking varint/small/encode: Analyzing
varint/small/encode time: [712.32 ns 719.77 ns 735.01 ns]
change: [+508.40% +511.08% +517.07%] (p = 0.00 < 0.05)
Performance has regressed.
Found 12 outliers among 100 measurements (12.00%)
1 (1.00%) high mild
11 (11.00%) high severe
Benchmarking varint/small/decode
Benchmarking varint/small/decode: Warming up for 3.0000 s
Benchmarking varint/small/decode: Collecting 100 samples in estimated 5.0002 s (59M iterations)
Benchmarking varint/small/decode: Analyzing
varint/small/decode time: [84.904 ns 84.909 ns 84.915 ns]
change: [+2.8137% +2.8705% +2.9044%] (p = 0.00 < 0.05)
Performance has regressed.
Found 8 outliers among 100 measurements (8.00%)
5 (5.00%) high mild
3 (3.00%) high severe
Benchmarking varint/small/encoded_len
Benchmarking varint/small/encoded_len: Warming up for 3.0000 s
Benchmarking varint/small/encoded_len: Collecting 100 samples in estimated 5.0006 s (35M iterations)
Benchmarking varint/small/encoded_len: Analyzing
varint/small/encoded_len
time: [141.77 ns 141.79 ns 141.81 ns]
change: [-0.4000% -0.3777% -0.3572%] (p = 0.00 < 0.05)
Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) low mild
Benchmarking varint/medium/encode
Benchmarking varint/medium/encode: Warming up for 3.0000 s
Benchmarking varint/medium/encode: Collecting 100 samples in estimated 5.0014 s (1.4M iterations)
Benchmarking varint/medium/encode: Analyzing
varint/medium/encode time: [3.5368 µs 3.5371 µs 3.5373 µs]
change: [+511.09% +511.21% +511.32%] (p = 0.00 < 0.05)
Performance has regressed.
Found 8 outliers among 100 measurements (8.00%)
2 (2.00%) high mild
6 (6.00%) high severe
Benchmarking varint/medium/decode
Benchmarking varint/medium/decode: Warming up for 3.0000 s
Benchmarking varint/medium/decode: Collecting 100 samples in estimated 5.0003 s (25M iterations)
Benchmarking varint/medium/decode: Analyzing
varint/medium/decode time: [196.17 ns 196.18 ns 196.20 ns]
change: [+13.686% +13.893% +14.107%] (p = 0.00 < 0.05)
Performance has regressed.
Found 4 outliers among 100 measurements (4.00%)
3 (3.00%) low mild
1 (1.00%) high mild
Benchmarking varint/medium/encoded_len
Benchmarking varint/medium/encoded_len: Warming up for 3.0000 s
Benchmarking varint/medium/encoded_len: Collecting 100 samples in estimated 5.0005 s (35M iterations)
Benchmarking varint/medium/encoded_len: Analyzing
varint/medium/encoded_len
time: [141.76 ns 141.78 ns 141.81 ns]
change: [-0.3550% -0.3347% -0.3145%] (p = 0.00 < 0.05)
Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe
Benchmarking varint/large/encode
Benchmarking varint/large/encode: Warming up for 3.0000 s
Benchmarking varint/large/encode: Collecting 100 samples in estimated 5.0055 s (707k iterations)
Benchmarking varint/large/encode: Analyzing
varint/large/encode time: [7.0789 µs 7.0796 µs 7.0809 µs]
change: [+512.86% +512.97% +513.09%] (p = 0.00 < 0.05)
Performance has regressed.
Found 12 outliers among 100 measurements (12.00%)
5 (5.00%) low mild
4 (4.00%) high mild
3 (3.00%) high severe
Benchmarking varint/large/decode
Benchmarking varint/large/decode: Warming up for 3.0000 s
Benchmarking varint/large/decode: Collecting 100 samples in estimated 5.0006 s (15M iterations)
Benchmarking varint/large/decode: Analyzing
varint/large/decode time: [332.25 ns 332.26 ns 332.28 ns]
change: [+19.258% +19.372% +19.478%] (p = 0.00 < 0.05)
Performance has regressed.
Found 7 outliers among 100 measurements (7.00%)
1 (1.00%) low severe
2 (2.00%) low mild
2 (2.00%) high mild
2 (2.00%) high severe
Benchmarking varint/large/encoded_len
Benchmarking varint/large/encoded_len: Warming up for 3.0000 s
Benchmarking varint/large/encoded_len: Collecting 100 samples in estimated 5.0001 s (35M iterations)
Benchmarking varint/large/encoded_len: Analyzing
varint/large/encoded_len
time: [141.97 ns 141.99 ns 142.01 ns]
change: [-0.2585% -0.2381% -0.2192%] (p = 0.00 < 0.05)
Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) low mild
Benchmarking varint/mixed/encode
Benchmarking varint/mixed/encode: Warming up for 3.0000 s
Benchmarking varint/mixed/encode: Collecting 100 samples in estimated 5.0137 s (1.2M iterations)
Benchmarking varint/mixed/encode: Analyzing
varint/mixed/encode time: [4.2047 µs 4.2060 µs 4.2071 µs]
change: [+561.37% +561.58% +561.79%] (p = 0.00 < 0.05)
Performance has regressed.
Found 5 outliers among 100 measurements (5.00%)
3 (3.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe
Benchmarking varint/mixed/decode
Benchmarking varint/mixed/decode: Warming up for 3.0000 s
Benchmarking varint/mixed/decode: Collecting 100 samples in estimated 5.0004 s (23M iterations)
Benchmarking varint/mixed/decode: Analyzing
varint/mixed/decode time: [220.34 ns 220.63 ns 220.93 ns]
change: [+5.3118% +5.5255% +5.7338%] (p = 0.00 < 0.05)
Performance has regressed.
Benchmarking varint/mixed/encoded_len
Benchmarking varint/mixed/encoded_len: Warming up for 3.0000 s
Benchmarking varint/mixed/encoded_len: Collecting 100 samples in estimated 5.0003 s (35M iterations)
Benchmarking varint/mixed/encoded_len: Analyzing
varint/mixed/encoded_len
time: [141.97 ns 141.99 ns 142.01 ns]
change: [-0.1881% -0.1684% -0.1474%] (p = 0.00 < 0.05)
Change within noise threshold.
Running unittests src/lib.rs (x86_64-unknown-linux-gnu/release/deps/prost_build-8f05cd6f4d753c67)
running 25 tests
test ast::tests::test_codeblocks ... ignored
test ast::tests::test_comment_append_with_indent_leaves_prespaced_lines ... ignored
test ast::tests::test_comment_append_with_indent_sanitizes_comment_doc_url ... ignored
test ast::tests::test_comment_append_with_indent_sanitizes_square_brackets ... ignored
test code_generator::c_escaping::tests::test_unescape_c_escape_string ... ignored
test code_generator::c_escaping::tests::test_unescape_c_escape_string_incomplete_hex_value - should panic ... ignored
test extern_paths::tests::test_extern_paths ... ignored
test extern_paths::tests::test_well_known_types ... ignored
test ident::tests::test_sanitize_identifier ... ignored
test ident::tests::test_strip_enum_prefix ... ignored
test ident::tests::test_to_snake ... ignored
test ident::tests::test_to_snake_non_raw_keyword ... ignored
test ident::tests::test_to_snake_raw_keyword ... ignored
test ident::tests::test_to_upper_camel ... ignored
test path::tests::test_get_best ... ignored
test path::tests::test_get_keep_order ... ignored
test path::tests::test_get_matches_sub_path ... ignored
test path::tests::test_prefixes ... ignored
test path::tests::test_suffixes ... ignored
test tests::deterministic_include_file ... ignored
test tests::finalize_package ... ignored
test tests::smoke_test ... ignored
test tests::test_generate_field_attributes ... ignored
test tests::test_generate_message_attributes ... ignored
test tests::test_generate_no_empty_outputs ... ignored
test result: ok. 0 passed; 0 failed; 25 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (release/deps/prost_derive-f633ab0ea8bc5a37)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (x86_64-unknown-linux-gnu/release/deps/prost_types-059e1d6052a18dbc)
running 18 tests
test any::tests::check_any_serialization ... ignored
test datetime::tests::check_duration_parse_to_string_roundtrip ... ignored
test datetime::tests::check_timestamp_parse_to_string_roundtrip ... ignored
test datetime::tests::test_datetime_from_timestamp ... ignored
test datetime::tests::test_min_max ... ignored
test datetime::tests::test_parse_duration ... ignored
test datetime::tests::test_parse_non_ascii ... ignored
test datetime::tests::test_parse_timestamp ... ignored
test duration::tests::check_duration_normalize ... ignored
test duration::tests::check_duration_roundtrip ... ignored
test duration::tests::check_duration_roundtrip_nanos ... ignored
test duration::tests::check_duration_try_from_negative_nanos ... ignored
test timestamp::tests::check_system_time_roundtrip ... ignored
test timestamp::tests::check_timestamp_negative_seconds ... ignored
test timestamp::tests::check_timestamp_negative_seconds_1ns ... ignored
test timestamp::tests::check_timestamp_normalize ... ignored
test timestamp::tests::check_timestamp_roundtrip_via_system_time ... ignored
test type_url::tests::check_type_url_parsing ... ignored
test result: ok. 0 passed; 0 failed; 18 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running benches/dataset.rs (x86_64-unknown-linux-gnu/release/deps/dataset-944ff70fe25f46e3)
Benchmarking dataset/google_message1_proto2/merge
Benchmarking dataset/google_message1_proto2/merge: Warming up for 3.0000 s
Benchmarking dataset/google_message1_proto2/merge: Collecting 100 samples in estimated 5.0016 s (12M iterations)
Benchmarking dataset/google_message1_proto2/merge: Analyzing
dataset/google_message1_proto2/merge
time: [404.30 ns 404.43 ns 404.58 ns]
change: [+70.077% +70.218% +70.355%] (p = 0.00 < 0.05)
Performance has regressed.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) low mild
Benchmarking dataset/google_message1_proto2/encode
Benchmarking dataset/google_message1_proto2/encode: Warming up for 3.0000 s
Benchmarking dataset/google_message1_proto2/encode: Collecting 100 samples in estimated 5.0008 s (9.8M iterations)
Benchmarking dataset/google_message1_proto2/encode: Analyzing
dataset/google_message1_proto2/encode
time: [510.79 ns 510.95 ns 511.12 ns]
change: [+189.90% +190.61% +191.29%] (p = 0.00 < 0.05)
Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
Benchmarking dataset/google_message1_proto2/encoded_len
Benchmarking dataset/google_message1_proto2/encoded_len: Warming up for 3.0000 s
Benchmarking dataset/google_message1_proto2/encoded_len: Collecting 100 samples in estimated 5.0002 s (104M iterations)
Benchmarking dataset/google_message1_proto2/encoded_len: Analyzing
dataset/google_message1_proto2/encoded_len
time: [48.160 ns 48.167 ns 48.175 ns]
change: [+34.251% +34.812% +35.242%] (p = 0.00 < 0.05)
Performance has regressed.
Found 13 outliers among 100 measurements (13.00%)
1 (1.00%) low mild
3 (3.00%) high mild
9 (9.00%) high severe
Benchmarking dataset/google_message1_proto3/merge
Benchmarking dataset/google_message1_proto3/merge: Warming up for 3.0000 s
Benchmarking dataset/google_message1_proto3/merge: Collecting 100 samples in estimated 5.0004 s (14M iterations)
Benchmarking dataset/google_message1_proto3/merge: Analyzing
dataset/google_message1_proto3/merge
time: [353.81 ns 353.93 ns 354.06 ns]
change: [+80.502% +80.697% +80.878%] (p = 0.00 < 0.05)
Performance has regressed.
Found 10 outliers among 100 measurements (10.00%)
1 (1.00%) low mild
7 (7.00%) high mild
2 (2.00%) high severe
Benchmarking dataset/google_message1_proto3/encode
Benchmarking dataset/google_message1_proto3/encode: Warming up for 3.0000 s
Benchmarking dataset/google_message1_proto3/encode: Collecting 100 samples in estimated 5.0020 s (8.6M iterations)
Benchmarking dataset/google_message1_proto3/encode: Analyzing
dataset/google_message1_proto3/encode
time: [592.17 ns 592.29 ns 592.41 ns]
change: [+295.59% +296.67% +297.32%] (p = 0.00 < 0.05)
Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild
Benchmarking dataset/google_message1_proto3/encoded_len
Benchmarking dataset/google_message1_proto3/encoded_len: Warming up for 3.0000 s
Benchmarking dataset/google_message1_proto3/encoded_len: Collecting 100 samples in estimated 5.0001 s (47M iterations)
Benchmarking dataset/google_message1_proto3/encoded_len: Analyzing
dataset/google_message1_proto3/encoded_len
time: [107.36 ns 107.42 ns 107.48 ns]
change: [+243.40% +243.77% +244.10%] (p = 0.00 < 0.05)
Performance has regressed.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
Benchmarking dataset/google_message2/merge
Benchmarking dataset/google_message2/merge: Warming up for 3.0000 s
Benchmarking dataset/google_message2/merge: Collecting 100 samples in estimated 5.2812 s (25k iterations)
Benchmarking dataset/google_message2/merge: Analyzing
dataset/google_message2/merge
time: [209.86 µs 209.96 µs 210.04 µs]
change: [+58.113% +59.364% +60.094%] (p = 0.00 < 0.05)
Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
2 (2.00%) low mild
1 (1.00%) high mild
Benchmarking dataset/google_message2/encode
Benchmarking dataset/google_message2/encode: Warming up for 3.0000 s
Benchmarking dataset/google_message2/encode: Collecting 100 samples in estimated 5.3001 s (20k iterations)
Benchmarking dataset/google_message2/encode: Analyzing
dataset/google_message2/encode
time: [256.85 µs 258.41 µs 260.31 µs]
change: [+226.97% +227.93% +229.22%] (p = 0.00 < 0.05)
Performance has regressed.
Found 6 outliers among 100 measurements (6.00%)
3 (3.00%) high mild
3 (3.00%) high severe
Benchmarking dataset/google_message2/encoded_len
Benchmarking dataset/google_message2/encoded_len: Warming up for 3.0000 s
Benchmarking dataset/google_message2/encoded_len: Collecting 100 samples in estimated 5.0410 s (288k iterations)
Benchmarking dataset/google_message2/encoded_len: Analyzing
dataset/google_message2/encoded_len
time: [17.475 µs 17.476 µs 17.477 µs]
change: [+39.737% +39.779% +39.845%] (p = 0.00 < 0.05)
Performance has regressed.
Found 6 outliers among 100 measurements (6.00%)
4 (4.00%) high mild
2 (2.00%) high severe
Running unittests src/lib.rs (x86_64-unknown-linux-gnu/release/deps/single_include-46d506d149ec976b)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/main.rs (x86_64-unknown-linux-gnu/release/deps/single_include-febdb286c56ec1d2)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (x86_64-unknown-linux-gnu/release/deps/tests-7327582f544cb804)
running 41 tests
test bootstrap::bootstrap ... ignored
test debug::basic ... ignored
test debug::oneof_with_enum ... ignored
test debug::tuple_struct ... ignored
test deprecated_field::test_warns_when_using_fields_with_deprecated_field ... ignored
test enum_keyword_variant::dummy ... ignored
test extern_paths::test ... ignored
test generic_derive::generic_enum ... ignored
test message_encoding::check_default_values ... ignored
test message_encoding::check_repeated_floats ... ignored
test message_encoding::check_scalar_types ... ignored
test message_encoding::check_tags_inferred ... ignored
test no_root_packages::test ... ignored
test no_unused_results::dummy ... ignored
test packages::test ... ignored
test skip_debug::oneof_with_enum_custom_debug ... ignored
test skip_debug::test_proto_msg_custom_debug ... ignored
test skip_debug::tuple_struct_custom_debug ... ignored
test submessage_without_package::test_submessage_without_package ... ignored
test tests::test_267_regression ... ignored
test tests::test_all_types_proto3 ... ignored
test tests::test_custom_type_attributes ... ignored
test tests::test_deep_nesting ... ignored
test tests::test_deep_nesting_group ... ignored
test tests::test_deep_nesting_map ... ignored
test tests::test_deep_nesting_oneof ... ignored
test tests::test_deep_nesting_repeated ... ignored
test tests::test_default_enum ... ignored
test tests::test_default_string_escape ... ignored
test tests::test_enum_from_string ... ignored
test tests::test_enum_to_string ... ignored
test tests::test_enum_try_from_i32 ... ignored
test tests::test_file_descriptor_set_path ... ignored
test tests::test_group ... ignored
test tests::test_group_oneof ... ignored
test tests::test_ident_conversions ... ignored
test tests::test_nesting ... ignored
test tests::test_proto3_presence ... ignored
test tests::test_recursive_oneof ... ignored
test type_names::valid_type_names ... ignored
test unittest::extreme_default_values ... ignored
test result: ok. 0 passed; 0 failed; 41 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests ../tests/src/lib.rs (x86_64-unknown-linux-gnu/release/deps/tests_2015-01ba1ffc9663584e)
running 41 tests
test bootstrap::bootstrap ... ignored
test debug::basic ... ignored
test debug::oneof_with_enum ... ignored
test debug::tuple_struct ... ignored
test deprecated_field::test_warns_when_using_fields_with_deprecated_field ... ignored
test enum_keyword_variant::dummy ... ignored
test extern_paths::test ... ignored
test generic_derive::generic_enum ... ignored
test message_encoding::check_default_values ... ignored
test message_encoding::check_repeated_floats ... ignored
test message_encoding::check_scalar_types ... ignored
test message_encoding::check_tags_inferred ... ignored
test no_root_packages::test ... ignored
test no_unused_results::dummy ... ignored
test packages::test ... ignored
test skip_debug::oneof_with_enum_custom_debug ... ignored
test skip_debug::test_proto_msg_custom_debug ... ignored
test skip_debug::tuple_struct_custom_debug ... ignored
test submessage_without_package::test_submessage_without_package ... ignored
test tests::test_267_regression ... ignored
test tests::test_all_types_proto3 ... ignored
test tests::test_custom_type_attributes ... ignored
test tests::test_deep_nesting ... ignored
test tests::test_deep_nesting_group ... ignored
test tests::test_deep_nesting_map ... ignored
test tests::test_deep_nesting_oneof ... ignored
test tests::test_deep_nesting_repeated ... ignored
test tests::test_default_enum ... ignored
test tests::test_default_string_escape ... ignored
test tests::test_enum_from_string ... ignored
test tests::test_enum_to_string ... ignored
test tests::test_enum_try_from_i32 ... ignored
test tests::test_file_descriptor_set_path ... ignored
test tests::test_group ... ignored
test tests::test_group_oneof ... ignored
test tests::test_ident_conversions ... ignored
test tests::test_nesting ... ignored
test tests::test_proto3_presence ... ignored
test tests::test_recursive_oneof ... ignored
test type_names::valid_type_names ... ignored
test unittest::extreme_default_values ... ignored
test result: ok. 0 passed; 0 failed; 41 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests ../tests/src/lib.rs (x86_64-unknown-linux-gnu/release/deps/tests_no_std-97f8c586338de55f)
running 36 tests
test debug::oneof_with_enum ... ignored
test debug::tuple_struct ... ignored
test deprecated_field::test_warns_when_using_fields_with_deprecated_field ... ignored
test enum_keyword_variant::dummy ... ignored
test extern_paths::test ... ignored
test generic_derive::generic_enum ... ignored
test message_encoding::check_default_values ... ignored
test message_encoding::check_repeated_floats ... ignored
test message_encoding::check_scalar_types ... ignored
test message_encoding::check_tags_inferred ... ignored
test no_root_packages::test ... ignored
test no_unused_results::dummy ... ignored
test packages::test ... ignored
test submessage_without_package::test_submessage_without_package ... ignored
test tests::test_267_regression ... ignored
test tests::test_all_types_proto3 ... ignored
test tests::test_custom_type_attributes ... ignored
test tests::test_deep_nesting ... ignored
test tests::test_deep_nesting_group ... ignored
test tests::test_deep_nesting_map ... ignored
test tests::test_deep_nesting_oneof ... ignored
test tests::test_deep_nesting_repeated ... ignored
test tests::test_default_enum ... ignored
test tests::test_default_string_escape ... ignored
test tests::test_enum_from_string ... ignored
test tests::test_enum_to_string ... ignored
test tests::test_enum_try_from_i32 ... ignored
test tests::test_file_descriptor_set_path ... ignored
test tests::test_group ... ignored
test tests::test_group_oneof ... ignored
test tests::test_ident_conversions ... ignored
test tests::test_nesting ... ignored
test tests::test_proto3_presence ... ignored
test tests::test_recursive_oneof ... ignored
test type_names::valid_type_names ... ignored
test unittest::extreme_default_values ... ignored
test result: ok. 0 passed; 0 failed; 36 ignored; 0 measured; 0 filtered out; finished in 0.00s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment