09 Aralık 2017 tarihinde Mimar Sinan Kongre Merkezi, Antalya‘da Akdeniz Bilişim Zirvesi 2017 etkinliği gerçekleştirildi.
Ben de Unity3D ile Cross-Platform Oyun Geliştirme konulu oturumda konuşmacı olarak yer aldım.
Katılan tüm arkadaşlara teşekkür ederim.
24 Kasım 2017 tarihinde Haliç Üniversitesi‘nde sevgili arkadaşım Uğur Umutluoğlu ile birlikte 1. Bilişim Günleri etkinliğine katıldık.
Ben de Azure, Xamarin, Universal Windows Platform (UWP) başlıklarını konuştuğum oturumda konuşmacı olarak yer aldım.
Etkinliği organize eden ve etkinliğe katılan tüm arkadaşlara teşekkür ederim.
Ne tür bir uygulama geliştiriyor olursak olalım (Web, Mobile, Cloud, Game, Desktop, etc) string tipi üzerinde karşılaştırma mutlaka yaparız.
Bu makalede, string değişkenler üzerinde yapabileceğimiz karşılaştırma methodlarını performans odaklı olarak inceleyeceğiz.
Ben aşağıdaki 4 yöntemi karşılaştırmaya karar verdim, eğer sizin aklınıza başka karşılaştırma yöntemleri gelirse, aşağıdaki Yorumlar alanına veya Issues altına bir yorum bırakabilirsiniz ;)
Öncelikle test ortamımızı oluşturalım, bunun için TestScenarios ve Program isimli birer class oluşturuyoruz.
Program.cs dosyasında yeralan Program class‘ında sadece TestScenarios class‘ından yeni bir instance oluşturup, InvokeTest() methodunu çağırıyoruz;
TestScenarios class‘ı içerisinde, üzerinde testleri geçekleştireceğimiz, string bir değişkene ihtiyacımız var;
Ben, kendi bilgisayarımda, karşılaştırma operasyonunu 10 Milyon (10_000_000) defa yapıp, toplam harcanan süreyi ölçtüm;
Karşılaştırma operasyonunu gerçekleştirip, sonucu ekrana yazdırabilmek için TestAndPrint() isimli bir method geliştirdim;
Bu method içerisinde, öncelikle, Stopwatch tipinde bir değişken oluşturuyorum.
GarbageCollector tarafından testin etkilenmemesi için, GC sınıfının Collect() methodunu Generation 2 için çalıştırıyorum.
Sonra da, WaitForFullGCComplete() methodu ile, eğer yürüyen bir Collect() operasyonu varsa, tamamlanmasını bekliyorum.
Stopwatch değişkenini Restart() edip, sıfırlıyor, Action tipinde aldığım Test() parametresini çağırıyor, geçen toplam süreyi milisaniye cinsinden ekrana yazıyorum.
Şimdi, tek tek, String.IndexOf(), String.Contains(), Regex.IsMatch() ve Regex.IsMatch(Compiled) test senaryolarını yazalım;
String.IndexOf() testi için;
String.Contains() testi için;
Regex.IsMatch() testi için;
Regex.IsMatch(Compiled) testi için;
Şimdi, TestScenarios class içerisine InvokeTest() methodu yazıyoruz;
Her testi 2 kere çalıştırıyoruz, biri karşılaştırma sonucu başarılı olacak şekilde, biri başarılı olmayacak şekilde.
Gelelim, en önemli kısma, karşılaştırma sonuçları :)
Sonuçlara baktığım zaman aşağıdaki noktalar dikkatimi çekti;
Microsoft‘un Github‘da yayınladığı ReferenceSource repository’sinde String classının Contains() methodu aşağıdaki şekilde yazılmış;
Aslında Contains() methodu, içeride IndexOf() methodunu çağırıyor.
Peki, neden bizim testlerimizde Contains() ve IndexOf() farklı sonuçlar üretti?
Çünkü, Contains() methodu içinden IndexOf() methodu, StringComparison.Ordinal
parametresi ile çağırılıyor.
Eğer kendi uygulamalarımızda IndexOf() methodunu çağıracaksak, StringComparison.Ordinal
parametresini kullanmamız performans artışı sağlayacaktır.
Daha kolayı, Contains() methodunu kullanmak :)
11 Kasım 2017 tarihinde DevNot .Net Core Day 2017 etkinliği gerçekleştirildi.
Ben de .Net Core ile Chatbot Geliştirme konulu oturumda konuşmacı olarak yer aldım.
Etkinlikte gerçekleştirdim konuşmayı aşağıdaki videodan izleyebilirsiniz;
Etkinliği gerçekleştirmemizi sağlayan sevgili arkadaşım Uğur Umutluoğlu‘na ve etkinliğe katılan tüm arkadaşlara teşekkür ederim.
Bu makale de gene email üzerinden aldığım bir soruyu cevaplayacağım.
Soru, C# ile Binary Search Tree örneği nasıl geliştirebilirim?
Önce Tree (Ağaç) yapılarını inceleyelim.
Tree (Ağaç) yapıları ile, birbirleri arasında Parent-Child ilişkisi bulunan veriler modellenebiliyor.
Örneğin, bilgisayardaki dizinler ve dosyalar, ürün ağaçları, veya organizasyon şemaları, Tree (Ağaç) yapısında saklanırlar;
Tree (Ağaç) yapılarında, bir öğenin birden fazla alt öğesi olabilir
Hatta Root (Kök) öğe bile, gerekirse birden fazla olabilir.
Tree (Ağaç) veri yapılarına ilişkin tanımlamalar;
Binary Tree (genellikle İkili Ağaç olarak Türkçeleştirilir) yapıları ise, Root (Kök) olarak tek bir elemana sahip olan ve her dalında en fazla 2 öğe bulunabilen özel bir Tree (Ağaç) veri modelidir.
Gelelim asıl konumuza, Binary Search Tree :)
Binary Search Tree yapıları, Binary Tree yapılarının özelleşmiş bir halidir.
Root (Kök) olarak gene tek bir node‘a sahiptir, her node, kendisine bağlı en fazla 2 node‘a sahip olabilir.
Bu noktaya kadar Binary Tree yapıları ile aynı özelliklere sahip, farklı olarak, node‘lara bağlanan child node‘ların içerdiği değerler, parent node‘un kendi değerinden küçükse soldaki, büyük veya eşitse sağdaki node‘a kaydedilir.
Böylece, Tree (Ağaç) yapısı üzerinde yapılacak aramalar çok hızlı sonuçlanacaktır.
Tree (Ağaç) yapısının Degree (Derece) değeri kaç ise, o kadar adımda aranan değere ulaşılabilir.
Yukarıdaki örnekte, 50 değerine 1 adımda, 72 değerine 2 adımda, 23 değerine 3 adımda, 67 değerine 4 adımda ulaşılabilecektir.
Binary Search Tree yapıları sayesinde, int.Max
(2^32 : 2.147.483.647) kadar farklı değere sahip olan Tree (Ağaç) yapılarında bile arama işlemi 32 adımda sonuçlanacaktır.
.Net Core ile Binary Search Tree örneği geliştirmek için hemen yeni bir proje oluşturalım;
İlk olarak Node
sınıfını oluşturalım. Nispeten basit bir sınıf olacak;
Value
özelliği sayesinde int
tipinde değer içerebiliyor, ayrıca kendisine bağlanabilecek 2 Node
‘u, Left
ve Right
isimli özelliklerde tutabiliyor.
Fakat int
yerine string
, DateTime
veya Customer
tipli Node
‘lar oluşturmak istersek yeni Node
sınıfları üretmemiz gerekir.
Daha iyisi, Node
sınıfını Generic hale getirmek;
Artık Tree
sınıfını yazabiliriz ve onu da Generic yapmakta fayda var;
Tree
sınıfına yazdığımız Top
özelliği sayesinde, Tree (Ağaç) yapısının başlangıç Node
‘unu tanımlamış olduk.
Aslında Binary Search Tree yapısını tamamlamış olduk. Fakat yeni Node
eklemek, hatta ekranda listelemek için gereken method’ları da Tree
sınıfına eklememiz iyi olacaktır.
Node
eklemek için Tree
sınıfına Add()
methodu ekleyelim.
Add()
methodu parametre olarak T
tipinde değer alsın ve bu değere uygun bir yer bulup ekleme işlemini gerçekleştirsin.
Hatta, Add()
sınıfının T
tipinde parametresini dizi şeklinde yapalım, böylece, istenirse aynı anda birden fazla değer ekleme işlemine tabi tutulabilir.
Hatta, T[]
tipindeki parametrenin başına params
anahtar kelimesini ekleyebiliriz ve böylece Add()
methodu çağırılırken değerler dizi şeklinde değil, virgülle ayrılmış şekilde de verilebilir.
Binary Search Tree yapısına ekleyeceğimiz Node
‘ları, mümkün olduğu kadar dengelememiz iyi olacaktır. Böylece, arama işlemi çok hızlı gerçekleşir.
Dengeli dağıtılan Node
yapısına Balanced Tree adı verilir.
Eğer dengeli bir ağaç yapısı oluşturamazsak, Node
‘lar sağlı-sollu değil, uç-uca dizilecektir.
Uç-Uca dizilen Node
‘lar üzerinde arama yapılacağı zaman Root (Kök) Node
‘dan başlanıp, neredeyse tüm Node’lara uğranması gerekir.
Dengeli dizilen Node
‘lar üzerinde arama yapılacağı zaman ise, Root (Kök) Node
‘dan başlandığında, her seferinde ya Left Node
, ya Right Node
üzerinden devam edilerek, çok daha az Node
‘a uğranır.
Binary Search Tree yapısını Balanced (Dengeli) hale getirmek için, ekleyeceğimiz Node
‘ların tam orta noktasını Root (Kök) Node
olarak belirlemeliyiz.
Add()
methodunun içerisinde, parametre olarak gelen dizinin orta noktasını bulmak için, önce sıralıyor, sonra dizi uzunluğunun yarısı kadar elemanı atlıyor, karşımıza çıkan ilk elemanı seçiyoruz;
Orta elemanı diziden çıkartıp, dizinin ilk elemanı olacak şekilde tekrar Insert()
ediyoruz.
Artık dizi üzerinde bir döngü kurup, tüm Node
‘ları tek tek oluşturabiliriz;
Burada dikkat edilmesi gereken noktalar,
Top
özelliğine dizinin ilk kaydını (dizinin orta elemanı aslında) vermemizTree
'nin Node
'ları ile karşılaştırıyoruzComparer<T>
sınıfının Default
özelliğinde yer alan Compare
methodu ile karşılaştırma yapıyoruzLeft
ya da Right
özelliği üzerinden ilerleyerek, Tree
'ye Node
eklemesi yapıyoruzSenior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484