۳۰ آذر ۱۴۰۳

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 (پشتیبانی طولانی مدت)» را به عنوان نسخه چارچوبی که می خواهید استفاده کنید، انتخاب کنید.
  8. روی ایجاد کلیک کنید.
عملی با SolidJS

ما از این پروژه برنامه کاربردی کنسول 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های امروزی بهره می برد که می توانند چندین مقدار را به صورت موازی پردازش کنند.

برندان ایچ: کوکی ها و جاوا اسکریپت را سرزنش نکنید

SearchValues چیست؟

SearchValues ​​نوع جدیدی در فضای نام System.Buffers در دات نت است که از بردارسازی و شتاب سخت افزاری برای بهبود کارایی و عملکرد جستجو استفاده می کند. کلاس 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 ​​به دست می آورید به داده های ورودی و نوع و حجم داده های جستجو شده بستگی دارد. با افزایش حجم داده‌ها، می‌توانید انتظار مزایای عملکرد قابل توجه‌تری داشته باشید.

محک زدن عملکرد جستجو در 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 ​​همه داده‌های لازم را هنگام نمونه‌سازی از قبل محاسبه می‌کند.