From 7dff50ae6cd121950e4225dfe6395e44947263ae Mon Sep 17 00:00:00 2001 From: pnv1 Date: Wed, 25 Jun 2025 10:46:15 +0300 Subject: Improve csv parsing speed in С++ csv library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- library/cpp/string_utils/csv/csv.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'library/cpp/string_utils') 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 + #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; -- cgit v1.3