summaryrefslogtreecommitdiffstats
path: root/library/cpp/string_utils/quote/bench/main.cpp
diff options
context:
space:
mode:
authorstyopkin <[email protected]>2026-02-24 23:25:06 +0300
committerstyopkin <[email protected]>2026-02-24 23:52:05 +0300
commitc71699717685cbba8eb4ee1b6e54fbc178e556da (patch)
tree6ca03f102b90e5eb1aef21c874368db9de7c489e /library/cpp/string_utils/quote/bench/main.cpp
parent901c3b42a699af9eb1b689b5d3d10250abb8daa0 (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.cpp124
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 = "!@#$%^&*(){}[]\" &param=!@#$%^&*(){}[]\" &param_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 = "!@#$%^&*(){}[]\" &param=!@#$%^&*(){}[]\" &param_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);
+ }
+}