diff options
author | pnv1 <pnv1@yandex-team.com> | 2025-06-25 10:46:15 +0300 |
---|---|---|
committer | pnv1 <pnv1@yandex-team.com> | 2025-06-25 11:35:36 +0300 |
commit | 7dff50ae6cd121950e4225dfe6395e44947263ae (patch) | |
tree | a260d80de0d772b11067132a9e6f08a9748e9a0f /library/cpp/string_utils/csv/csv.cpp | |
parent | 766e56cf1df73b7db3280fcb18a96030086bcf16 (diff) | |
download | ydb-7dff50ae6cd121950e4225dfe6395e44947263ae.tar.gz |
Improve csv parsing speed in С++ csv library
Improve csv parsing speed in csv library
На примере ВМ в QYP на ssd скорость чтении csv этой либой:
- до этих изменений стабильно показывает 383-387 MB/s
- после этих изменений стабильно показывает 613-615 MB/s
**++Просьба PR пока не мерджить++**.
Пока что надеюсь просто получить шип от овнеров. Мы собираем метрики по текущей производительности в процессе импорта в YDB CLI. Чуть позже, если всё ОК, вмерджу этот PR, чтобы мы замерили разницу.
commit_hash:a23fc7e631733ffe3cae2941da8b3bdb75bccc94
Diffstat (limited to 'library/cpp/string_utils/csv/csv.cpp')
-rw-r--r-- | library/cpp/string_utils/csv/csv.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/library/cpp/string_utils/csv/csv.cpp b/library/cpp/string_utils/csv/csv.cpp index fd3d932fcd5..6dd76de85fe 100644 --- a/library/cpp/string_utils/csv/csv.cpp +++ b/library/cpp/string_utils/csv/csv.cpp @@ -1,3 +1,5 @@ +#include <algorithm> + #include "csv.h" TStringBuf NCsvFormat::CsvSplitter::Consume() { @@ -70,10 +72,10 @@ TString NCsvFormat::TLinesSplitter::ConsumeLine() { TString result; TString line; while (Input.ReadLine(line)) { - for (auto it = line.begin(); it != line.end(); ++it) { - if (*it == Quote) { - Escape = !Escape; - } + const size_t quoteCount = std::count(line.cbegin(), line.cend(), Quote); + // A theoretically faster version of "if (quoteCount %2 == 1)" + if (quoteCount & 1) { + Escape = !Escape; } if (!result) { result = line; |