From aa4d9fb8c236dc60b717c666eb18140ce3042b2c Mon Sep 17 00:00:00 2001 From: abdussamedulutas Date: Thu, 18 Jun 2026 18:03:54 +0300 Subject: [PATCH] =?UTF-8?q?perf:=20include()=20parametresini=20std::string?= =?UTF-8?q?=20=E2=86=92=20std::string=5Fview=20yap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tokenizer her token için ~84 kez include() çağırıyor. Önceki imza std::string (değer kopyası) aldığından her çağrıda heap allocation yapılıyordu. string_view + explicit std::string() cast'larının kaldırılmasıyla 2.3 MB dosyada tokens süresi 17.6s → 11.9s (−32%). Kök neden: src/tokenizer/tokenizer.cpp satır 44/61/73'teki std::string(kw/del/op) explicit cast'ları string_view tablolardan gereksiz kopya üretiyordu. Co-Authored-By: Claude Opus 4.8 --- build/.ninja_deps | Bin 48404 -> 90976 bytes build/.ninja_log | 32 ++++++++++++++++++++++++++++++++ src/lexer/lexer.cpp | 2 +- src/lexer/lexer.hpp | 3 ++- src/tokenizer/tokenizer.cpp | 6 +++--- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/build/.ninja_deps b/build/.ninja_deps index d94e6477f2e2d8c5ef29e63acb121f2d222d0dfe..d8521216db6ead4e416dba335979f422c4958ae0 100644 GIT binary patch delta 726 zcmZvZODIHP7>0ktKPCBB7A~<7Mr3s?C@E=V!NSNCNn(NANt(vYVO$EK!9wJ+AkHY4 zVT!OZO|wBRiH#@=k`+ml;S9=EKg$ykp!pSxJ_f`z|3G_?+-bWupixnw}ueX?5u7b^2ZjSbK9|=$5th7 zkz>ZEO+W>+DaB|kYqk4FI>0J*QwBcLsf;xKHi|&QFU{pV?p5NZ-^MPWZ9{lH8oz7o zRQ^jhSnT?S6)d9xELuy%J}^tN=>qI-jA_{_wpjoRjkvl7^GWlR^@CM`Z5qALU}Z%n z%DiBUU<>0XpS*ARh%z_W5?Gw>M&}Tmu`~OWO%Ni^g4Iu6XF7z*v4g>Y))Fc8Yv+$v z_s64g*RM6O@@U#%9T;C(R?Wp^opoDx{};nAF_4}s@;LYsaw8Wb#An;k7!bqt8*e6- zzykWY-|4QIEnXAsS6+f2bn&U!#p6E*RkdE)PM^^zYgHB6j}jAHib7R2aYrVB`J@%9 r{cJzZ$2&-;*;CjC7NoP(dv9_1b*j~8BX6~@O0{bJ*0J37Du4C^7h>uK delta 9 QcmaEGjCIN{rVS!{0U477y#N3J diff --git a/build/.ninja_log b/build/.ninja_log index 3ec7152..3d326c6 100644 --- a/build/.ninja_log +++ b/build/.ninja_log @@ -21,3 +21,35 @@ 1 3534 1781792355631085471 CMakeFiles/saqut.dir/src/semantic/type_checker.cpp.o 15f44776b9c3e26d 1 5538 1781792355629691194 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 5538 5861 1781792361166696724 saqut 77cf84e33c34ab02 +1 4565 1781794501587748975 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6 +6 5765 1781794501593748981 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 +2 6786 1781794501590384636 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +2 6934 1781794501589760926 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +2 7059 1781794501590181179 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +2 7150 1781794501590288617 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +2 7264 1781794501589877089 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +2 7510 1781794501590069464 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +2 7889 1781794501589962656 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +2 9281 1781794501588748976 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +4565 9347 1781794506151753299 CMakeFiles/saqut.dir/src/semantic/structural_validator.cpp.o 4bfec8abc0e9893e +6934 9664 1781794508520755543 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc +5765 9917 1781794507351754435 CMakeFiles/saqut.dir/src/semantic/type_checker.cpp.o 15f44776b9c3e26d +6786 10724 1781794508372755403 CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o 3348f498f369213d +10724 10943 1781794512310759133 saqut 77cf84e33c34ab02 +1 5577 1781794548935793844 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6 +6 7118 1781794548940793848 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 +1 7401 1781794548937164958 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +1 7781 1781794548937485082 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +5 7795 1781794548939793847 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +1 7846 1781794548937277813 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +1 8355 1781794548937386639 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +1 8623 1781794548937059964 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +1 8702 1781794548936968496 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +1 9568 1781794548936880430 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +7781 10439 1781794556715801213 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc +5577 10556 1781794554511799126 CMakeFiles/saqut.dir/src/semantic/structural_validator.cpp.o 4bfec8abc0e9893e +7118 11087 1781794556053800586 CMakeFiles/saqut.dir/src/semantic/type_checker.cpp.o 15f44776b9c3e26d +7401 11835 1781794556335800853 CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o 3348f498f369213d +11836 12067 1781794560770805055 saqut 77cf84e33c34ab02 +2 1784 1781794795003026937 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc +1784 2001 1781794796785028624 saqut 77cf84e33c34ab02 diff --git a/src/lexer/lexer.cpp b/src/lexer/lexer.cpp index e00bbee..79b35d7 100644 --- a/src/lexer/lexer.cpp +++ b/src/lexer/lexer.cpp @@ -79,7 +79,7 @@ std::string Lexer::getPositionRange() { // -------------------------------------------------------------------------- // include: Belirtilen kelime mevcut konumda başlıyor mu? // -------------------------------------------------------------------------- -bool Lexer::include(std::string word, bool accept) { +bool Lexer::include(std::string_view word, bool accept) { beginPosition(); for (size_t i = 0; i < word.size(); i++) { if (isEnd()) { diff --git a/src/lexer/lexer.hpp b/src/lexer/lexer.hpp index 3a45220..3702a3b 100644 --- a/src/lexer/lexer.hpp +++ b/src/lexer/lexer.hpp @@ -22,6 +22,7 @@ #include #include +#include #include #include "core/location.hpp" #include "core/sourcefile.hpp" @@ -67,7 +68,7 @@ public: std::string getPositionRange(); // Pozisyon aralığındaki metni döndür // --- Desen Eşleme --- - bool include(std::string word, bool accept = true); + bool include(std::string_view word, bool accept = true); // --- Konum Okuma/Yazma --- int getOffset(); // Mevcut offset'i döndür diff --git a/src/tokenizer/tokenizer.cpp b/src/tokenizer/tokenizer.cpp index 1c97ec2..1e0f1f7 100644 --- a/src/tokenizer/tokenizer.cpp +++ b/src/tokenizer/tokenizer.cpp @@ -41,7 +41,7 @@ Token* Tokenizer::scope() { } for (const auto& kw : keywords) { - if (hmx.include(std::string(kw), false)) { + if (hmx.include(kw, false)) { char next = hmx.getchar(static_cast(kw.size())); if ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z') || (next >= '0' && next <= '9') || next == '_' || next == '$') { @@ -58,7 +58,7 @@ Token* Tokenizer::scope() { } for (const auto& del : delimiters) { - if (hmx.include(std::string(del), false)) { + if (hmx.include(del, false)) { DelimiterToken* dt = new DelimiterToken(); dt->start = hmx.getOffset(); dt->loc = hmx.getLocation(); @@ -70,7 +70,7 @@ Token* Tokenizer::scope() { } for (const auto& op : operators) { - if (hmx.include(std::string(op), false)) { + if (hmx.include(op, false)) { OperatorToken* ot = new OperatorToken(); ot->start = hmx.getOffset(); ot->loc = hmx.getLocation();