Performans Notları
Örüntüleri dikkatle derleyin
Performans Notları, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
Derleme Maliyetlidir
Bir dizeden std::regex oluşturmak deseni derler ve bu maliyetlidir. En büyük kazanım, deseni bir kez derleyip yeniden kullanmaktır.
- Döngülerin içinde regex oluşturmaktan kaçının.
- Başlangıçta veya ilk kullanımda derleyin.
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d+");
std::string inputs[] = {"12", "ab", "99"};
for (const auto& s : inputs) {
std::cout << s << ": " << std::regex_match(s, p) << '\n';
}
return 0;
}Derlenmiş Deseni Yeniden Kullanma
Deseni döngünün dışında bir kez oluşturun ve her girdi için yeniden kullanın. Her yinelemede yeniden oluşturmak zaman kaybettirir.
#include <iostream>
#include <regex>
#include <vector>
int main() {
static const std::regex p("[a-z]+");
std::vector<std::string> words = {"hello", "WORLD", "cpp"};
int matches = 0;
for (const auto& w : words) {
if (std::regex_match(w, p)) ++matches;
}
std::cout << "Matched: " << matches << '\n';
return 0;
}Sabitler İçin static const
Hiç değişmeyen bir desen için, tüm çağrılar boyunca tam olarak bir kez derlenmesi amacıyla bir işlevin içinde static const bildiriminde bulunun.
#include <iostream>
#include <regex>
bool isEmail(const std::string& s) {
static const std::regex p("\\w+@\\w+\\.\\w+");
return std::regex_match(s, p);
}
int main() {
std::cout << std::boolalpha;
std::cout << isEmail("a@b.com") << '\n';
std::cout << isEmail("nope") << '\n';
return 0;
}Doğru Dilbilgisini Seçme
Regex çeşidi (dilbilgisi) hızı ve özellikleri etkiler. std::regex::ECMAScript varsayılandır ve en zengin özelliklere sahiptir; std::regex::basic veya extended daha basittir ve bazen daha hızlıdır.
#include <iostream>
#include <regex>
int main() {
std::regex p("a+", std::regex::extended);
std::cout << std::boolalpha << std::regex_match("aaa", p) << '\n';
return 0;
}optimize Bayrağı
std::regex::optimize eklemek, motora deseni oluşturmak için daha fazla zaman harcayıp karşılığında daha hızlı eşleştirme yapmasını söyler. Bu, çok sayıda eşleştirme yaptığınızda işe yarar.
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d{3}-\\d{4}", std::regex::optimize);
std::cout << std::boolalpha << std::regex_match("123-4567", p) << '\n';
return 0;
}Yıkıcı Geri İzlemeden Kaçınma
(a+)+ gibi iç içe niceleyiciler, belirli girdilerde sürenin üstel biçimde artmasına neden olabilir. Daha basit ve belirsizliğe yer bırakmayan desenleri tercih edin.
#include <iostream>
#include <regex>
int main() {
std::regex good("a+b");
std::cout << std::boolalpha << std::regex_match("aaaab", good) << '\n';
return 0;
}Mümkün Olduğunda Çapa Kullanın
^ ve $ ile sabitleme, motorun her başlangıç konumunu denemek yerine hızlıca başarısız olmasını sağlar.
#include <iostream>
#include <regex>
int main() {
std::regex p("^[a-z]{3}$");
std::cout << std::boolalpha;
std::cout << std::regex_search("abc", p) << '\n';
std::cout << std::regex_search("abcd", p) << '\n';
return 0;
}Mümkün Olduğunda Basit Araçları Tercih Edin
Yalnızca sabit bir alt dize denetimine ihtiyacınız varsa std::string::find, regex'ten çok daha hızlıdır. Regex'i gerçek desen eşleştirmeleri için saklayın.
#include <iostream>
#include <string>
int main() {
std::string s = "hello world";
bool has = s.find("world") != std::string::npos;
std::cout << std::boolalpha << has << '\n';
return 0;
}Eşleşme Nesnesini Yeniden Kullanma
Aramayı tekrarlarken ek yükü azaltmak için her seferinde yeni bir std::smatch oluşturmak yerine tek bir std::smatch nesnesini yeniden kullanın.
#include <iostream>
#include <regex>
#include <vector>
int main() {
static const std::regex p("(\\d+)");
std::smatch m;
std::vector<std::string> data = {"x1", "y22", "z333"};
for (const auto& s : data) {
if (std::regex_search(s, m, p)) std::cout << m[1] << ' ';
}
std::cout << '\n';
return 0;
}Deseninizi Daraltın
Belirli karakter sınıfları, her şeyi eşleyen noktadan daha hızlı ve güvenli eşleşir. Rakamları kastettiğinizde [0-9] yerine . kullanmayı tercih edin.
#include <iostream>
#include <regex>
int main() {
std::regex specific("[0-9]{2}");
std::cout << std::boolalpha;
std::cout << std::regex_match("42", specific) << '\n';
std::cout << std::regex_match("ab", specific) << '\n';
return 0;
}En İyi Duruma Getirmeden Önce Ölçün
<chrono> hakkında öğrendiklerinizi birleştirin: Bir değişikliğin gerçekten yararlı olduğunu uygulamaya almadan önce doğrulamak için düzenli ifade kullanımınızın süresini ölçün.
#include <iostream>
#include <regex>
#include <chrono>
int main() {
using namespace std::chrono;
static const std::regex p("\\d+");
auto s = steady_clock::now();
int hits = 0;
for (int i = 0; i < 1000; ++i) {
if (std::regex_search(std::string("x") + std::to_string(i), p)) ++hits;
}
auto e = steady_clock::now();
std::cout << "hits=" << hits << ", timed: " << ((e - s).count() >= 0) << '\n';
return 0;
}Kısa Kontrol
Düzenli ifadelerin başarımı hakkındaki anlayışınızı sınayın.
Özet
Düzenli ifadeleri verimli şekilde nasıl kullanacağınızı öğrendiniz:
- Desenleri, ideal olarak
static constolarak, bir kez derleyin ve yeniden kullanın - Doğru dil bilgisini seçin ve
optimizeseçeneğini değerlendirin - Felaket düzeyinde geri izlemekten kaçının ve mümkün olduğunda deseni sabitleyin
- Sabit alt dizeler için
findgibi daha basit araçları kullanın ve değişiklikleri ölçün
Düzenli İfadeler kursu böylece tamamlanır.
Sıkça Sorulan Sorular
“Performans Notları” dersi ücretsiz mi?
Evet — “Performans Notları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“Performans Notları” dersinde ne öğreneceğim?
Örüntüleri dikkatle derleyin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Performans Notları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- regex Temelleri
- Yakalama Grupları
- Arama ve Değiştirme
- Performans Notları