diff options
| author | styopkin <[email protected]> | 2026-02-24 23:25:06 +0300 |
|---|---|---|
| committer | styopkin <[email protected]> | 2026-02-24 23:52:05 +0300 |
| commit | c71699717685cbba8eb4ee1b6e54fbc178e556da (patch) | |
| tree | 6ca03f102b90e5eb1aef21c874368db9de7c489e /library/cpp/string_utils/quote/bench/main.cpp | |
| parent | 901c3b42a699af9eb1b689b5d3d10250abb8daa0 (diff) | |
faster escape
2% int'ов сидят в Escape. pepe watafa.
<https://nda.ya.ru/t/AJC4zGq27VFEkb>
Тут играясь с блоками получилось на реальном cgi из прода \~33% срезать. Мелочь, а приятно. На самом деле, хотелось бы узнать как правильно делать "некрасивую, но ускоряющую" гадость в library/cpp. Все тесты работают, но тем не менее =)
До: <https://nda.ya.ru/t/Iv6Y0jQf7VFEkc>
После: <https://nda.ya.ru/t/KO_Rgvi87VFEke>
Тут, к сожалению не на прогрузе, но уже видно.
commit_hash:671028887e7d9320c8e9a393a0abb203207eb883
Diffstat (limited to 'library/cpp/string_utils/quote/bench/main.cpp')
| -rw-r--r-- | library/cpp/string_utils/quote/bench/main.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/library/cpp/string_utils/quote/bench/main.cpp b/library/cpp/string_utils/quote/bench/main.cpp new file mode 100644 index 00000000000..6763691c52c --- /dev/null +++ b/library/cpp/string_utils/quote/bench/main.cpp @@ -0,0 +1,124 @@ +#include <library/cpp/string_utils/quote/quote.cpp> +#include <library/cpp/testing/benchmark/bench.h> + +#include <library/cpp/resource/resource.h> + +#include <util/string/vector.h> + +Y_CPU_BENCHMARK(OldEscapeSmall, iface) { + const auto n = iface.Iterations(); + TString r = "1234"; + char buf[20]; + for (size_t i = 0; i < n; ++i) { + CGIEscape(buf, r.c_str()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(NewEscapeSmall, iface) { + const auto n = iface.Iterations(); + TString r = "1234"; + char buf[20]; + for (size_t i = 0; i < n; ++i) { + CGIEscape(buf, r.begin(), r.size()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(OldEscapeMedium, iface) { + const auto n = iface.Iterations(); + TString kekw = "!@#$%^&*(){}[]\" ¶m=!@#$%^&*(){}[]\" ¶m_param=!@#$%^&*(){}[]\" "; + char buf[300]; + for (size_t i = 0; i < n; ++i) { + CGIEscape(buf, kekw.c_str()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(NewEscapeMedium, iface) { + const auto n = iface.Iterations(); + TString kekw = "!@#$%^&*(){}[]\" ¶m=!@#$%^&*(){}[]\" ¶m_param=!@#$%^&*(){}[]\" "; + char buf[300]; + for (size_t i = 0; i < n; ++i) { + CGIEscape(buf, kekw.begin(), kekw.size()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(OldEscapeBig, iface) { + const auto n = iface.Iterations(); + + TString kekw = NResource::Find("/test_files/long_cgi.txt"); + char buf[200'000]; + for (size_t i = 0; i < n; ++i) { + CGIEscape(buf, kekw.c_str()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(NewEscapeBig, iface) { + const auto n = iface.Iterations(); + + TString kekw = NResource::Find("/test_files/long_cgi.txt"); + char buf[200'000]; + for (size_t i = 0; i < n; ++i) { + CGIEscape(buf, kekw.begin(), kekw.size()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(OldEscapeArray, iface) { + const auto n = iface.Iterations(); + + TString kek = NResource::Find("/test_files/cgi_array.txt"); + TVector<TString> inputs = SplitString(kek, "\n"); + char buf[350'000]; + for (size_t i = 0; i < n; ++i) { + TString& kekw = inputs[i % inputs.size()]; + + CGIEscape(buf, kekw.c_str()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(NewEscapeArray, iface) { + const auto n = iface.Iterations(); + + TString kek = NResource::Find("/test_files/cgi_array.txt"); + TVector<TString> inputs = SplitString(kek, "\n"); + char buf[350'000]; + for (size_t i = 0; i < n; ++i) { + TString& kekw = inputs[i % inputs.size()]; + + CGIEscape(buf, kekw.begin(), kekw.size()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(OldEscapeHugeArray, iface) { + const auto n = iface.Iterations(); + + TString kek = NResource::Find("/test_files/cgi_huge_array.txt"); + TVector<TString> inputs = SplitString(kek, "\n"); + char buf[350'000]; + for (size_t i = 0; i < n; ++i) { + TString& kekw = inputs[i % inputs.size()]; + + CGIEscape(buf, kekw.c_str()); + Y_FAKE_READ(buf); + } +} + +Y_CPU_BENCHMARK(NewEscapeHugeArray, iface) { + const auto n = iface.Iterations(); + + TString kek = NResource::Find("/test_files/cgi_huge_array.txt"); + TVector<TString> inputs = SplitString(kek, "\n"); + char buf[350'000]; + for (size_t i = 0; i < n; ++i) { + TString& kekw = inputs[i % inputs.size()]; + + CGIEscape(buf, kekw.begin(), kekw.size()); + Y_FAKE_READ(buf); + } +} |
