• Buradasın

    .NET Framework'de String Parsing Teknikleri ve Performans Karşılaştırması

    youtube.com/watch?v=uU8AIHkE3Jw

    Yapay zekadan makale özeti

    • Bu video, Salih Cantekin tarafından sunulan bir programlama eğitim içeriğidir. Eğitmen, tweet olarak sorduğu bir sorunun cevabını paylaşmaktadır.
    • Videoda, log dosyalarından HTTP GET isteklerinin bilgilerini (tarih, HTTP metodu, path, status kodu ve duration) dört farklı yöntemle (string, split, string span ve regex) nasıl pars edilebileceği gösterilmektedir. Eğitmen, bu yöntemlerin performans karşılaştırmasını yaparak, hangi yöntemin daha verimli olduğunu açıklamaktadır. Özellikle string span yöntemi üzerinden adım adım kod yazımı ve performans analizi yapılmaktadır.
    • Video ayrıca bellek yönetimi konusunu da ele almaktadır. Farklı kod bloklarında bellek allocation (bellek ayırma) işlemlerini inceleyen eğitmen, Span yapısının bellek allocation'larını nasıl azaltabileceğini ve performans açısından avantajlarını göstermektedir. .NET Framework'ün farklı sürümlerinde (6, 7, 8) bu metodların performans karşılaştırması yapılarak, özellikle .NET 8'de Span ve Substring metodlarının daha az bellek tüketimi ve daha hızlı sonuçlar verdiği belirtilmektedir.
    Sorunun Tanıtımı
    • Salih Cantekin, daha önce tweet olarak attığı bir sorunun cevabını paylaşacak.
    • Soruda bir benchmark sonuçları ve dört farklı testin sıralaması isteniyordu.
    • Amacımız, loglarda görünen HTTP GET metodunun bazı bilgilerini (date time, HTTP metod, path, status kodu, duration) dört farklı yöntemle (string split, pub, string span ve regex) pars etmek ve bir model oluşturmak.
    01:33Projenin Yapısı
    • Projede bir model (class/record) bulunuyor ve bu modelde duration, HTTP metod ve created date alanları var.
    • Dört farklı yöntem kullanılıyor: Spring, split, regex ve compile regex versiyonu.
    • Sadece HTTP GET metodlarını pars ediyoruz, delete, put, post gibi diğer metodları ilgilenmiyoruz.
    02:51Substring Yöntemi ile Pars İşlemi
    • Log satırlarını foreach döngüsü içinde dolaşarak pars işlemi yapılıyor.
    • İlk olarak HTTP metodunu kontrol ediyoruz: 20. karakterden 3. karaktere kadar olan üç karakteri alarak "GET" olup olmadığını kontrol ediyoruz.
    • Eğer HTTP metod "GET" değilse, diğer pars işlemlerini yapmadan devam ediyoruz.
    05:16DateTime ve Duration Bilgilerini Pars Etme
    • DateTime bilgisini almak için 19. karakterden 28. karaktere kadar olan 9 karakteri alıyoruz.
    • DateTime'ı parse etmek için DateTime.ParseExact metodunu kullanıyoruz.
    • Duration bilgisini almak için son boşluğu bulup, duration indeksinden 3 çıkararak milisaniye kısmını alıyoruz ve integer'a dönüştürüyoruz.
    08:46Substring Yönteminin Performansı
    • Substring yöntemi kullanıldığında her satır için yeni bir string nesnesi oluşturuluyor.
    • String referans tipli ve immutable olduğu için, substring işlemi yapıldığında pointer stake'de, verinin kendisi heap'de tutulacak şekilde yeni bir string nesne yaratılıyor.
    • Bu yöntemde allocation (veri ayırma) işlemi gerçekleşiyor.
    10:06Bellek Ayırma Analizi
    • Day time objesi struct bir nesne olduğu için bellekte stack tarafında bulunur ve allocation yaratılmaz.
    • String'ler bellekte allocation yaratır, ancak primitive tipler (integer) bellekte allocation yaratmaz.
    • Duration.str oluştururken substring kullanılır ve her satır için 30 milisaniye için 2 byte'lık bir yer allocation edilir.
    11:28Log Modeli ve Split Metodu
    • Log modelindeki record'lar heap tarafında tutulur ve referans type'lar olduğu için allocation yaratır.
    • Split metodu boşluklara göre pars eder ve string array oluşturur, bu dinamik bir obje olduğu için heap tarafında tutulur.
    • Split metodu iki tane ekstra allocation yaratır çünkü date ve time ayrı ayrı gelir ve birleştirilmesi gerekir.
    14:30HTTP Metodu ve Regex Kullanımı
    • HTTP metodu doğrudan bir string değişkenine referans atar ve sadece atama işlemi yapar.
    • Regex pattern'i bir kere yaratılır ve metod bir kere çağrıldığı için statik olarak aynı referans kullanılabilir.
    • Regex çalıştırıldığında satırın ne tür bir istek (GET, DELETE, POST) olduğu önemli olmaz, her satır için allocation gerçekleşir.
    17:50Regex Avantajları ve Compile Kullanımı
    • Regex compile kullanıldığında daha hızlı cevap döner, ancak benchmark sonuçlarında çok büyük fark görülmez.
    • Çokça çağrılan bir metot olsaydı compile kullanımı farkı ortaya çıkarırdı.
    • Span'ler konusu kanalda anlatılmıştır.
    18:42Span Kullanımı ve Avantajları
    • Span, bellek allocation yapmadan veri işleme imkanı sağlayan bir yapıdır.
    • Span'ler, string fonksiyonlarına gönderildiğinde bellek allocation yapmadan işlem yapabilir.
    • Span'lerin kullanım alanlarına bakarken, gönderilen fonksiyonların span desteklediğinden emin olmak önemlidir.
    20:21Span Kullanımı Örnekleri
    • Span'ler, string fonksiyonlarına gönderildiğinde bellek allocation yapmadan işlem yapabilir.
    • Span'ler, string fonksiyonlarına gönderildiğinde bellek allocation yapmadan işlem yapabilir.
    • Span'ler, string fonksiyonlarına gönderildiğinde bellek allocation yapmadan işlem yapabilir.
    26:26Span Kullanımının Avantajları
    • Span'ler, daha az boyutlarda stringlerin allocation'ını sebep olur.
    • Span'ler, bellek allocation yapmadan daha hızlı işlem yapabilir.
    • Span'ler, bellek allocation yapmadan daha hızlı işlem yapabilir.
    28:11String İşleme Metodlarının Karşılaştırılması
    • Span ve subsstring metodları karşılaştırıldığında, subsstring'de üç karakterlik allocation gerçekleşti ve bu kontrol edilerek allocation yaratmaktan kurtulundu.
    • Split metodu, get olup olmamasına bakmadan boşluklara göre tüm verileri ayrı ayrı topladığı için 352 byte'lık büyük bir allocation gerçekleştirdi.
    • Regex ve regex compile metodları da farklı parametreler içerdiği için sınıfta kaldı.
    29:28Benchmark Test Sonuçları
    • Benchmark testinde span en tepede çıktı, ardından subsstring, split, regex ve regex compile geldi.
    • Regex compile sadece hızlı çalışmış, allocation tarafında ekstra bir avantaj sağlamadı.
    • Span tarafında 17 kilobayt'lık bellek tüketimi gerçekleşti, subsstring tarafında ise 63 kilobayt.
    30:10.NET Sürümlerine Göre Performans Farkları
    • .NET 8'de span 322 nano saniye sürerken, .NET 6'daki span'dan biraz daha yavaş çalıştı.
    • .NET 8'de cold start yapıldığında iyileştirmeler görüldü, uzun süreli çalıştırıldığında daha hızlı sonuçlar elde edildi.
    • .NET 8'de span kullanımı 97 nano saniye sürerken, .NET 8'de 79'a kadar düşmüş, subsstring kullanımı da hız konusunda iyileştirmeler gösterdi.
    32:17Sonuç ve Öneriler
    • .NET Framework'ün kendi içerisinde span'i kullanmaya başladığı bilinmektedir.
    • .NET 6, 7 ve 8 sürümlerinde span kullanımı arttıkça daha az memory allocation ve daha performanslı işlemler elde edilebilmektedir.
    • Index of metodunun içerisinde kullanılan metodlar uygulamanın hızını etkileyebilir.

    Yanıtı değerlendir

  • Yazeka sinir ağı makaleleri veya videoları özetliyor