ملاحظات حول الأداء
جمّع الأنماط بوعي
ملاحظات حول الأداء درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
التجميع مكلف
يؤدي إنشاء std::regex من سلسلة إلى تجميع النمط، وهو أمر مكلف. وأكبر مكسب في الأداء هو تجميعه مرة واحدة وإعادة استخدامه.
- تجنب إنشاء regex داخل الحلقات.
- جمّعه عند بدء التشغيل أو عند أول استخدام.
#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;
}إعادة استخدام نمط مُجمَّع
أنشئ النمط مرة واحدة خارج الحلقة وأعد استخدامه مع كل إدخال. تؤدي إعادة بنائه في كل تكرار إلى إهدار الوقت.
#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;
}static const للثوابت
إذا كان النمط لا يتغير مطلقًا، فأعلنه static const داخل دالة لكي يُجمَّع مرة واحدة بالضبط عبر جميع الاستدعاءات.
#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;
}اختيار القواعد النحوية المناسبة
تؤثر نكهة regex، أي القواعد النحوية، في السرعة والميزات. تُعد std::regex::ECMAScript الافتراضية والأغنى بالميزات، بينما تكون std::regex::basic أو extended أبسط وأسرع أحيانًا.
#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
تخبر إضافة std::regex::optimize المحركَ بأن يقضي وقتًا أطول في بناء النمط مقابل مطابقة أسرع، ويكون ذلك مفيدًا عند إجراء المطابقة مرات عديدة.
#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;
}تجنب التراجع الكارثي
قد تتسبب محددات التكرار المتداخلة مثل (a+)+ في انفجار زمني أُسّي مع مدخلات معينة. فضّل الأنماط الأبسط وغير الملتبسة.
#include <iostream>
#include <regex>
int main() {
std::regex good("a+b");
std::cout << std::boolalpha << std::regex_match("aaaab", good) << '\n';
return 0;
}استخدم التثبيت متى أمكن
يسمح التثبيت باستخدام ^ و$ للمحرك بالفشل سريعًا، بدلًا من تجربة كل موضع بداية.
#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;
}فضّل الأدوات البسيطة عند الإمكان
إذا كنت تحتاج فقط إلى التحقق من وجود جزء ثابت من سلسلة، فإن std::string::find أسرع بكثير من regex. استخدم regex للمطابقة النمطية الفعلية فقط.
#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;
}إعادة استخدام كائن المطابقة
عند البحث بصورة متكررة، أعد استخدام std::smatch واحد بدلًا من تخصيص كائن جديد في كل مرة لتقليل النفقات الإضافية.
#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;
}ضيّق النمط
تطابق فئات المحارف المحددة بسرعة وأمان أكبر من النقطة الشاملة. استخدم [0-9] بدلًا من . عندما تقصد الأرقام.
#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;
}قِس قبل التحسين
اجمع ما تعلمته عن <chrono>: قِس زمن استخدام التعبير النمطي للتأكد من أن التغيير مفيد فعلًا قبل اعتماده.
#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;
}اختبار سريع
اختبر مدى فهمك لأداء التعبيرات النمطية.
مراجعة
لقد تعلمت كيفية استخدام التعبيرات النمطية بكفاءة:
- جمّع الأنماط مرة واحدة، ويفضل أن تكون
static const، ثم أعد استخدامها - اختر البنية النحوية المناسبة وفكّر في استخدام
optimize - تجنب التراجع الكارثي وثبّت النمط عند الإمكان
- استخدم أدوات أبسط مثل
findللسلاسل الفرعية الثابتة، وقِس أثر التغييرات
وبذلك يكتمل مساق التعبيرات النمطية.
الأسئلة الشائعة
هل درس «ملاحظات حول الأداء» مجاني؟
نعم — نص درس «ملاحظات حول الأداء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «ملاحظات حول الأداء»؟
جمّع الأنماط بوعي تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «ملاحظات حول الأداء»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات regex
- المجموعات الملتقطة
- البحث والاستبدال
- ملاحظات حول الأداء