Dizi işleme, herhangi bir uygulamada performans açısından en kritik alanlardan biridir. Dizeler değişmez olduğundan, birçok dize nesnesini çok hızlı bir şekilde biriktirebilir, bu da uygulama performansını olumsuz yönde etkileyecek bellek kaynağı tahsislerine neden olur.
Bir dizeden dize eklediğinizde veya alt dizeleri çıkardığınızda, yeni dize örnekleri oluşturulur. Aynısı, mevcut olanları yeniden kullanmak yerine yeni dize nesneleri oluşturan dize birleştirme gibi işlemler gerçekleştirdiğinizde de geçerlidir. Oluşturulan dize örneklerinin sayısını azaltmak ve ayrıca tahsisleri azaltmak için dizeleri birleştirirken StringBuilder sınıfından nasıl yararlanabileceğimizi gördük.
Dizelerle verimli çalışma konusundaki tartışmamıza devam ederken, bu makalede, herhangi bir kaynak yükü olmadan dizeler oluşturmak için String.Create yöntemini nasıl kullanabileceğimize bakacağız. Dize sıkıştırma, genel olarak kaynak tüketimini azaltmak için harika bir teknik olsa da, String.Create, dizeleri verimli bir şekilde işlemek için kullanabileceğiniz başka bir tekniktir; ancak bunu yalnızca belirli durumlarda tartışacağız.
Bu makalede verilen kod örnekleri ile çalışmak için sisteminizde Visual Studio 2022 kurulu olmalıdır. Halihazırda bir kopyanız yoksa Visual Studio 2022’yi buradan indirebilirsiniz.
Visual Studio 2022’de bir konsol uygulama projesi oluşturun
Öncelikle Visual Studio’da bir .NET Core konsol uygulama projesi oluşturalım. Sisteminizde Visual Studio 2022’nin kurulu olduğunu varsayarak, yeni bir .NET Core konsol uygulama projesi oluşturmak için aşağıda belirtilen adımları izleyin.
- Visual Studio IDE’yi başlatın.
- “Yeni bir proje oluştur” u tıklayın.
- “Yeni proje oluştur” penceresinde, görüntülenen şablonlar listesinden “Konsol Uygulaması”nı seçin.
- Sonrakine tıkla.
- Sonraki gösterilen “Yeni projenizi yapılandırın” penceresinde yeni proje için ad ve konum belirtin.
- “Ek Bilgiler” penceresinde, çalışma zamanı olarak .NET 6.0’ı seçin ve İleri’ye tıklayın.
- Oluştur’u tıklayın.
Aşağıdaki bölümlerde dizelerle çalışmak için bu .NET 6 konsol uygulaması projesini kullanacağız.
Yay ve Bellek
Span
C#’da String.Create yöntemi
String.Create yöntemi, C#’ın son sürümlerinde eklendi. String sınıfının Create yöntemi şu şekilde bildirilir:
public static string Create<TState> (int length, TState state, System.Buffers.SpanAction<char,TState> action);
String.Create yöntemi aşağıdakileri gerektirir:
- Oluşturulacak dizenin uzunluğu
- Veri (yani durum)
- Durumu bir dizgeye dönüştürebilen bir lambda işlevi
String.Create yöntemi, bir dizi karakter depolamak için öbek üzerinde bir bellek yığını ayırır. Bu yöntemin ilk parametresi, son dizenin uzunluğudur. İkinci parametre, dize nesnesini oluşturmak için gereken durumdur. Üçüncü ve son parametre, ayrılan yığındaki veriler üzerinde çalışması ve son dize nesnesini oluşturması gereken bir temsilcidir.
String.Create yöntemini çağırdığınızda, uzunluk bağımsız değişkeninizin değeri tarafından belirlenen önceden tanımlanmış bir boyuta sahip yeni bir dize oluşturur. Bunun, String.Create yöntemini kullanırken gerçekleşecek olan tek yığın ayırma olduğuna dikkat edin. Create yöntemi, String sınıfının bir üyesi olduğundan, yeni dize örneğinin dahili karakter verilerini temsil eden Span
Span
String.Create yöntemi ne zaman kullanılır?
String.Create’in birkaç özel kullanım durumu vardır. İlk olarak, String.Create’i yalnızca performans açısından kritik yollarda kullanmalısınız. İkinci olarak, String.Create öğesini yalnızca, dizenin boyutu ve biçimi sizin tarafınızdan biliniyorsa bir dize nesnesi oluşturmak istediğinizde kullanmalısınız. Örnek olarak, her istek için her yöntem çağrısıyla korelasyon kimliğini bir günlük dosyasına kaydetmek istediğinizi varsayalım. Bu tür dize örneklerini verimli bir şekilde oluşturmak için String.Create’den yararlanabilirsiniz. Performansa duyarlı birleştirmeler ve karmaşık dizeleri biçimlendirmek için String.Create’i de kullanabilirsiniz.
String.Create yöntemini kullanma
İşte String.Create yöntemini kullanmanın basit bir örneği:
char[] buffer = { 'a', 'e', 'i', 'o', 'u' };
string result = string.Create(buffer.Length, buffer, (c, b) => {
for (int i = 0; i < c.Length; i++) c[i] = b[i];
});
Aşağıda, korelasyon kimlikleri oluşturmak için String.Create’i nasıl kullanabileceğinizi gösteren başka bir örnek bulunmaktadır. Daha önce oluşturduğumuz konsol uygulama projesinin Program.cs dosyasına aşağıdaki kodu girin.
private static readonly char[] charactersToEncode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
private static string GetCorrelationId(long id)
{
return string.Create(10, id, (buffer, value) =>
{
char[] characters = charactersToEncode;
buffer[9] = characters[(value >> 5) & 31];
buffer[8] = characters[(value >> 10) & 31];
buffer[7] = characters[(value >> 15) & 31];
buffer[6] = characters[(value >> 20) & 31];
buffer[5] = characters[(value >> 25) & 31];
buffer[4] = characters[(value >> 30) & 31];
buffer[3] = characters[(value >> 35) & 31];
buffer[2] = characters[(value >> 40) & 31];
buffer[1] = characters[(value >> 45) & 31];
buffer[0] = characters[(value >> 50) & 31];
});
}
Yeni bir korelasyon kimliği almak için, aşağıda gösterildiği gibi Main yönteminden GetCorrelationId yöntemini çağırabilirsiniz:
static async Task Main(string[] args)
{
Console.WriteLine(GetCorrelationId(DateTime.UtcNow.Ticks));
Console.ReadKey();
}
String.Create sınırlamaları ve en iyi uygulamalar
String.Create kullanırken, öncelikle sınırlamalarını göz önünde bulundurmalısınız. Oluşturmak istediğiniz dizenin boyutunu önceden bilmelisiniz, bu da son dizenin oluşturulacağı durum nesnelerinin uzunluğunu bilmenizi gerektirir.
Ayrıca String.Create yöntemiyle çalışırken uymanız gereken iki en iyi uygulama vardır. İlk olarak, String.Create kullanmanın gerçekten daha iyi sonuçlar verdiğinden emin olmak için uygulamanızın performansını kıyaslamak akıllıca olacaktır. İkincisi, durum için birden çok nesne kullanıyorsanız, ValueTuples’tan yararlandığınızdan emin olun.
Son olarak, belirli senaryolarda String.Create öğesinin iyi bir seçim olmayabileceğini unutmayın. Uygulamanız veya geliştirme ekibiniz için okunabilirlik veya kültür önemli olduğunda String.Create kullanmamalısınız.
Bu nedenle, String.Create’i kullanıp kullanmamanız, dezavantajları ve performans avantajları arasındaki dengelere bağlıdır. Benim tavsiyem, kodunuzu kıyaslayın, sonuçları görün ve karar verin. Gelecekteki gönderilerde yüksek performanslı kod yazma hakkında daha fazla yazacağım.
Telif Hakkı © 2022 IDG Communications, Inc.
Kaynak : https://www.infoworld.com/article/3661361/how-to-work-with-string-create-in-c-sharp.html#tk.rss_all