@@ -49,21 +49,42 @@ size_t move_bench() {
4949 return inner_iters * 2 ;
5050}
5151
52- template <size_t Size, typename cmp_fn, bool same>
52+ // Overloaded make_rhs: convert iobuf to the desired RHS type
53+ template <typename T>
54+ T make_rhs (iobuf&& src);
55+
56+ template <>
57+ iobuf make_rhs<iobuf>(iobuf&& src) {
58+ return std::move (src);
59+ }
60+
61+ template <>
62+ ss::sstring make_rhs<ss::sstring>(iobuf&& src) {
63+ return src.linearize_to_string ();
64+ }
65+
66+ // Get the view type for comparison (iobuf& or string_view)
67+ const iobuf& as_cmp_arg (const iobuf& b) { return b; }
68+ std::string_view as_cmp_arg (const ss::sstring& b) { return b; }
69+
70+ template <size_t Size, typename cmp_fn, bool same, typename rhs_type = iobuf>
5371size_t cmp_bench () {
54- iobuf a = make_iobuf (Size);
55- iobuf a_copy = a.copy ();
56- iobuf b = make_iobuf (Size, !same);
57- iobuf b_copy;
58- for (const auto & frag : b) {
72+ // LHS: iobuf (single fragment and fragmented variants)
73+ iobuf lhs = make_iobuf (Size);
74+ iobuf lhs_fragmented;
75+ for (const auto & frag : lhs) {
5976 for (char c : std::string_view (frag.get (), frag.size ())) {
60- b_copy .append (&c, 1 );
77+ lhs_fragmented .append (&c, 1 );
6178 }
6279 }
80+
81+ // RHS: converted to target type (iobuf or ss::sstring)
82+ auto rhs = make_rhs<rhs_type>(make_iobuf (Size, !same));
83+
6384 perf_tests::start_measuring_time ();
6485 for (auto i = inner_iters; i--;) {
65- perf_tests::do_not_optimize (cmp_fn{}(a, b ));
66- perf_tests::do_not_optimize (cmp_fn{}(a_copy, b_copy ));
86+ perf_tests::do_not_optimize (cmp_fn{}(lhs, as_cmp_arg (rhs) ));
87+ perf_tests::do_not_optimize (cmp_fn{}(lhs_fragmented, as_cmp_arg (rhs) ));
6788 }
6889 perf_tests::stop_measuring_time ();
6990 return inner_iters * 2 ;
@@ -147,3 +168,20 @@ PERF_TEST(iobuf, eq_bench_large_same) {
147168PERF_TEST (iobuf, append_bench_small) { return append_bench<1'000 , 4 >(); }
148169PERF_TEST (iobuf, append_bench_medium) { return append_bench<1'000 , 40_KiB>(); }
149170PERF_TEST (iobuf, append_bench_large) { return append_bench<1'000 , 400_KiB>(); }
171+
172+ // iobuf vs string_view comparisons
173+ // clang-format off
174+ PERF_TEST (iobuf, sv_eq_0000) { return cmp_bench< 0 , std::equal_to<>, false , ss::sstring>(); }
175+ PERF_TEST (iobuf, sv_eq_0001) { return cmp_bench< 1 , std::equal_to<>, false , ss::sstring>(); }
176+ PERF_TEST (iobuf, sv_eq_1024) { return cmp_bench<1024 , std::equal_to<>, false , ss::sstring>(); }
177+ PERF_TEST (iobuf, sv_eq_0000_same) { return cmp_bench< 0 , std::equal_to<>, true , ss::sstring>(); }
178+ PERF_TEST (iobuf, sv_eq_0001_same) { return cmp_bench< 1 , std::equal_to<>, true , ss::sstring>(); }
179+ PERF_TEST (iobuf, sv_eq_1024_same) { return cmp_bench<1024 , std::equal_to<>, true , ss::sstring>(); }
180+
181+ PERF_TEST (iobuf, sv_cmp_0000) { return cmp_bench< 0 , std::less<>, false , ss::sstring>(); }
182+ PERF_TEST (iobuf, sv_cmp_0001) { return cmp_bench< 1 , std::less<>, false , ss::sstring>(); }
183+ PERF_TEST (iobuf, sv_cmp_1024) { return cmp_bench<1024 , std::less<>, false , ss::sstring>(); }
184+ PERF_TEST (iobuf, sv_cmp_0000_same) { return cmp_bench< 0 , std::less<>, true , ss::sstring>(); }
185+ PERF_TEST (iobuf, sv_cmp_0001_same) { return cmp_bench< 1 , std::less<>, true , ss::sstring>(); }
186+ PERF_TEST (iobuf, sv_cmp_1024_same) { return cmp_bench<1024 , std::less<>, true , ss::sstring>(); }
187+ // clang-format on
0 commit comments