123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #pragma once
- // Define BENCHMARK_PREFIX and BENCHMARKED_CLASS before including this file.
- #include <util/generic/xrange.h>
- #define Y_CPU_PREFIXED_BENCHMARK_HELPER(prefix, name, iface) Y_CPU_BENCHMARK(prefix##name, iface)
- #define Y_CPU_PREFIXED_BENCHMARK(prefix, name, iface) Y_CPU_PREFIXED_BENCHMARK_HELPER(prefix, name, iface)
- #define CONCATENATE3_HELPER(a, b, c) a##b##c
- #define CONCATENATE3(a, b, c) CONCATENATE3_HELPER(a, b, c)
- namespace {
- namespace CONCATENATE3(N, BENCHMARK_PREFIX, Benchmark) {
- using TBenchmarkedClass = BENCHMARKED_CLASS;
- const auto defaultString = TBenchmarkedClass();
- const auto emptyString = TBenchmarkedClass("");
- const auto lengthOneString = TBenchmarkedClass("1");
- const auto length1KString = TBenchmarkedClass(1000, '1');
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateDefault, iface) {
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass();
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateFromEmptyLiteral, iface) {
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass("");
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateFromLengthOneLiteral, iface) {
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass("1");
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CreateLength1K, iface) {
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass(1000, '1');
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyDefaultString, iface) {
- const auto& sourceString = defaultString;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass(sourceString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyEmptyString, iface) {
- const auto& sourceString = emptyString;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass(sourceString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyLengthOneString, iface) {
- const auto& sourceString = lengthOneString;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass(sourceString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyLength1KString, iface) {
- const auto& sourceString = length1KString;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto result = TBenchmarkedClass(sourceString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndUpdateLengthOneString, iface) {
- const auto& sourceString = lengthOneString;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString[0] = '0';
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendDefaultString, iface) {
- const auto& sourceString = defaultString;
- const TBenchmarkedClass::size_type insertPosition = sourceString.size();
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString.insert(insertPosition, 1, '0');
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendEmptyString, iface) {
- const auto& sourceString = emptyString;
- const TBenchmarkedClass::size_type insertPosition = sourceString.size();
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString.insert(insertPosition, 1, '0');
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendLengthOneString, iface) {
- const auto& sourceString = lengthOneString;
- const TBenchmarkedClass::size_type insertPosition = sourceString.size();
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString.insert(insertPosition, 1, '0');
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndPrependLengthOneString, iface) {
- const auto& sourceString = lengthOneString;
- const TBenchmarkedClass::size_type insertPosition = 0;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString.insert(insertPosition, 1, '0');
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndUpdateLength1KString, iface) {
- const auto& sourceString = length1KString;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString[0] = '0';
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndAppendLength1KString, iface) {
- const auto& sourceString = length1KString;
- const TBenchmarkedClass::size_type insertPosition = sourceString.size();
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString.insert(insertPosition, 1, '0');
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- Y_CPU_PREFIXED_BENCHMARK(BENCHMARK_PREFIX, CopyAndPrependLength1KString, iface) {
- const auto& sourceString = length1KString;
- const TBenchmarkedClass::size_type insertPosition = 0;
- for (const auto i : xrange(iface.Iterations())) {
- Y_UNUSED(i);
- auto targetString = TBenchmarkedClass(sourceString);
- auto result = targetString.insert(insertPosition, 1, '0');
- Y_DO_NOT_OPTIMIZE_AWAY(targetString);
- Y_DO_NOT_OPTIMIZE_AWAY(result);
- }
- }
- }
- }
- #undef CONCATENATE3
- #undef CONCATENATE3_HELPER
- #undef Y_CPU_PREFIXED_BENCHMARK
- #undef Y_CPU_PREFIXED_BENCHMARK_HELPER
|