عنوان:

‫سریع‌ترین راه برای کار با Regex در #C


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۰۳ ۰۹:۱۲
آدرس: www.dntips.ir
این مقاله روش‌های مختلف استفاده از عبارات با قاعده (Regex) در #C را بررسی و عملکرد آنها را محک می‌زند و نتیجه می‌گیرد که Regex تولید شده در زمان کامپایل (source-generated) بهترین عملکرد را ارائه می‌دهد.

تکنیک‌های تطبیق Regex و عملکرد آنها

  • Instantiated (بد): ایجاد یک شیء Regex جدید برای هر تطبیق به دلیل کامپایل مکرر، بسیار ناکارآمد است. از این روش اجتناب کنید.
  • Reusable (قابل استفاده‌ی مجدد): ایجاد یک نمونه Regex واحد و استفاده‌ی مجدد از آن بهتر است.
  • Inline (درون خطی): استفاده از متد استاتیک Regex.IsMatch با الگو و ورودی، عملکردی مشابه روش قابل استفاده‌ی مجدد را ارائه می‌دهد.
  • Source Generated / Compile-Time (کد تولید شده / زمان کامپایل): تعریف الگوهای Regex با استفاده از ویژگی [GeneratedRegex] در یک کلاس جزئی، به کامپایلر اجازه می‌دهد کد بهینه شده را در زمان کامپایل تولید کند که منجر به اجرای بسیار سریع‌تر می‌شود. این روش ارجح برای الگوهای ثابت است.
  • Reusable Compiled (قابل استفاده‌ی مجدد کامپایل شده): نمونه‌سازی یک Regex قابل استفاده‌ی مجدد با پرچم RegexOptions.Compiled سبب می‌شود، Regex در زمان اجرای برنامه کامپایل شود. پس از این هزینه‌ی کامپایل اولیه، عملکرد را بهبود می‌بخشد. اگر کد Regex تولید شده امکان‌پذیر نباشد، این بهترین گزینه بعدی است.

نتایج معیار

  • Regex نمونه‌سازی شده، 14 برابر کندتر از روش بعدی بود و باعث تخصیص حافظه‌ی بیش از حد شد.
  • روش‌های قابل استفاده‌ی مجدد و درون خطی، عملکردی مشابه داشتند.
  • کد Regex تولید شده، 14 برابر سریع‌تر از روش قابل استفاده‌ی مجدد یا درون خطی بود.
  • Regex کامپایل شده‌ی با قابلیت استفاده‌ی مجدد، بهبود عملکرد قابل توجهی را نسبت به Regex استاندارد قابل استفاده مجدد ارائه داد.

نکات کلیدی

  • برای الگوهای ثابت Regex، برای عملکرد بهینه، از کد Regex تولید شده / زمان کامپایل استفاده کنید.
  • اگر الگوها متغیر هستند یا تولید کد امکان‌پذیر نیست، از Regex کامپایل شده‌ی با قابلیت استفاده‌ی مجدد استفاده کنید.



مشاهده مطلب اصلی