۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

سرعت جستجو را با استفاده از SearchValues ​​در NET افزایش دهید

کلاس SearchValues ​​جدید از بردارسازی و شتاب سخت افزاری برای سرعت بخشیدن به جستجوهای مکرر در NET 8 بهره می برد.

کلاس SearchValues ​​جدید از بردارسازی و شتاب سخت افزاری برای سرعت بخشیدن به جستجوهای مکرر در NET 8 بهره می برد.

با انتشار .NET 8، مایکروسافت تعداد زیادی ویژگی‌ها و پیشرفت‌های جدید در چارچوب‌های NET Core و ASP.NET Core. یکی از این ویژگی‌ها کلاس SearchValues ​​است که گام مهمی در واکشی کارآمد داده‌ها از مجموعه داده‌ها را نشان می‌دهد.

SearchValues ​​نوع جدیدی است که در NET 8 برای بهبود عملکرد برنامه طراحی شده است. با استفاده از تکنیک‌های بهینه‌سازی مانند برداری و شتاب سخت‌افزاری، SearchValues ​​افزایش سرعت را ارائه می‌کند در حالی که به‌طور یکپارچه با NET Core و ASP.NET Core ترکیب می‌شود.

در این مقاله توضیح خواهیم داد که چگونه می توانید از SearchValues ​​برای بهبود سرعت جستجو در برنامه های NET Core استفاده کنید.

ایجاد یک پروژه برنامه کاربردی کنسول در ویژوال استودیو

ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را برای ایجاد یک پروژه برنامه کاربردی کنسول NET Core جدید دنبال کنید.

  1. Visual Studio IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. بعدی را کلیک کنید.
  7. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 8.0 (Long Term Support)» را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
  8. روی ایجاد کلیک کنید.
مایکروسافت .NET 9 Preview 6 را با طیف وسیعی از بهبودها به اجرا می گذارد

ما از این پروژه برنامه کاربردی کنسول NET 8 برای کار با نمونه‌های کد نشان داده شده در بخش‌های بعدی این مقاله استفاده خواهیم کرد.

مطالب عملکرد جستجوی رشته

جستجوهای رشته ای بخش اساسی بسیاری از برنامه ها هستند. در حالی که چندین روش برای جستجوی رشته ها وجود دارد، یافتن کارآمدترین روش در هر مورد می تواند چالش برانگیز باشد. برای مثال، در حالی که می‌توانید از روش IndexOfAny() برای جستجوی اولین رخداد یک کاراکتر در یک رشته استفاده کنید، ممکن است این روش برای جستجوهای بعدی که در آن داده‌های ورودی متفاوت است، بهترین روش نباشد.

کد زیر را در نظر بگیرید که نشان می‌دهد چگونه می‌توانید با استفاده از متد IndexOfAny() در یک رشته جستجو کنید.

string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
char[] c = {'s'};
int indexOfAlpha = str.IndexOfAny(c);

اگر بعداً می‌خواهید بیش از یک کاراکتر را در یک رشته جستجو کنید، به استراتژی جستجوی متفاوتی نیاز دارید، همانطور که در قطعه کد زیر نشان داده شده است.

string numeric = "0123456789";
int indexOfAlphaNumeric = str.IndexOfAny(numeric.ToCharArray());
Console.WriteLine(indexOfAlpha);
Console.WriteLine(indexOfAlphaNumeric);

توجه داشته باشید که ما عدد رشته را به آرایه ای از کاراکترها تبدیل کرده ایم زیرا متد IndexOfAny() به یک آرایه کاراکتری به عنوان پارامتر نیاز دارد. اگر بخواهیم طیفی از کاراکترها را جستجو کنیم، باید از یک رشته یا یک کاراکتر[] استفاده کنیم.

SearchValues ​​این انواع مختلف جستجوها را هم برای کدگذاری ساده‌تر و هم سریع‌تر اجرا می‌کند. به این دلیل که SearchValues ​​از پشتیبانی پردازش برداری در CPUهای امروزی بهره می برد که می توانند چندین مقدار را به صورت موازی پردازش کنند.

نحوه پیاده سازی احراز هویت در حداقل API ها در ASP.NET Core

SearchValues چیست؟

SearchValues ​​نوع جدیدی در فضای نام System.Buffers در NET است که از بردارسازی و شتاب سخت افزاری برای بهبود کارایی و عملکرد جستجو استفاده می کند. کلاس SearchValues مجموعه‌ای از مقادیر غیرقابل تغییر و فقط خواندنی را نشان می‌دهد.

شما می‌توانید از SearchValues در هر ReadOnlySpan استفاده کنید، که به این معنی است که می‌توانید از آن برای جستجوی نه تنها رشته‌ها، بلکه برای مقادیر در یک مجموعه یا حتی مقادیر در یک بلوک حافظه استفاده کنید. نمونه‌های SearchValues ​​به صراحت برای موقعیت‌هایی طراحی شده‌اند که از مجموعه مقادیر یکسانی اغلب برای جستجو در زمان اجرا استفاده می‌شود.

کد زیر را در نظر بگیرید.

SearchValues<char> searchValues = SearchValues.Create("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
bool IsAlphanumericContent(ReadOnlySpan<char> text) => 
text.IndexOfAny(searchValues) != -1 ? true:false;

می توانید با استفاده از کد زیر، روش IsAlphanumericContent() را برای بررسی اینکه آیا پارامتر حاوی متن الفبایی عددی است فراخوانی کنید.

Console.WriteLine(IsAlphanumericContent("This is an alphanumeric text for demonstration purposes 0nly."));

توجه داشته باشید که نوع SearchValues ​​برای جستجوی اولین وقوع یک مقدار خاص در یک مجموعه طراحی شده است.

وقتی از SearchValues ​​در کد خود استفاده می کنید، زمان اجرا یک پیاده سازی بهینه را برای سناریوی خاص تعیین می کند. به عنوان مثال، در مورد خط کد زیر، SearchValues ​​یک محدوده پیوسته از مقادیر را جستجو می کند و یک پیاده سازی بهینه را برای آن مورد استفاده تعیین می کند. 

SearchValues<char>.Create("12345");

دستاوردهای عملکردی که با SearchValues ​​به دست می آورید به داده های ورودی و نوع و حجم داده های جستجو شده بستگی دارد. با افزایش حجم داده‌ها، می‌توانید انتظار مزایای عملکرد قابل توجه‌تری داشته باشید.

نحوه پیاده سازی انعطاف پذیری اتصال پایگاه داده در ASP.NET Core

محک زدن عملکرد جستجو در NET.

کد زیر نشان می‌دهد که چگونه می‌توانید تست‌های معیار را برای مقایسه عملکرد روش IndexOfAny با استفاده از یک آرایه کاراکتری در مقابل استفاده از SearchValues ​​اجرا کنید.

[MemoryDiagnoser]
public class PerformanceBenchmark
{
    private char[]
    charValues = { 's', 'a', 'm', 'p', 'l', 'e' };
    private SearchValues<char> searchValues =
    SearchValues.Create("sample");
    private string text =
    "this text is in lower case for testing purposes only";

[Benchmark]
    public int IndexOfCharBenchmark()
    {
        return text.AsSpan().IndexOfAny(charValues);
    }

[Benchmark]
   public int IndexOfSearchValuesBenchmark()
   {
        return text.AsSpan().IndexOfAny(searchValues);
   }
}

برای اجرای تست‌های معیار بالا، باید کد زیر را در Program.cs خود مشخص کنید.

using BenchmarkDotNet.Running;
using SearchValuesDemo;
var summary = BenchmarkRunner.Run<PerformanceBenchmark>();

شکل ۱ تفاوت عملکرد این دو رویکرد را هنگام اجرای معیارها در پنجره کنسول نشان می‌دهد.

searchvalues ​​معیار

شکل ۱. SearchValues ​​برنده است!

همانطور که از داده‌های معیار می‌بینید، هنگام استفاده از SearchValues، عملکرد قابل توجهی افزایش می‌یابد.

معرفی SearchValues ​​در .NET 8 نشان دهنده یک تغییر الگو در کارایی جستجوی مقادیر در مجموعه ای از داده ها است. System.Buffers.SearchValues نوع جدیدی است که برای کارآمدی زمانی طراحی شده است که مجموعه ای از مقادیر اغلب برای جستجوها در طول زمان اجرا استفاده می شود. برای افزایش کارایی فرآیند جستجو، SearchValues ​​همه داده‌های لازم را هنگام نمونه‌سازی از قبل محاسبه می‌کند.