Archive for May, 2008
May 3, 2008 at 12:34 am · Filed under İpuçları (.NET)
Parse metodu, başarısız olması halinde ArgumentNullException, FormatException veya OverflowException oluşturmaktadır. Çoğu zaman oluşan bu exceptionlara ihtiyaç duymayız. Bu gibi durumlarda ihtiyaç duymadığımız exceptionlar, uygulamalarımızın performansını olumsuz etkilemektedir.
TryParse metodu, dönüştürme işleminin başarısız olması halinde exception oluşturmak yerine false değerini döner.
Aşağıdaki kod bloğunun çalışması 21,217 Saniye sürmektedir.
DateTime startTime = DateTime.UtcNow;
for (int i = 0; i < 5000; i++)
{
try
{
int n = Int32.Parse(“test”);
}
catch { }
}
DateTime endTime = DateTime.UtcNow;
Ancak bu kod bloğunu aşağıdaki şekilde değiştirdiğimiz zaman işlem süresi 0,1 saniyeye düşmektedir.
DateTime startTime = DateTime.UtcNow;
for (int i = 0; i < 5000; i++)
{
try
{
int n;
Int32.TryParse(“test”, out n);
}
catch { }
}
DateTime endTime = DateTime.UtcNow;
Gördüğünüz gibi gereksiz exceptionların uygulama performansı üzerindeki olumsuz etkisi oldukça büyük.
May 1, 2008 at 8:56 pm · Filed under İpuçları (.NET)
Çoğu zaman yazılım geliştiricilerin dikkat etmediği, ancak uygulama performansını ciddi oranda etkileyen bir konudur string birleştirme işlemleri. Çoğu zaman += ile bir string değişkenin değerini değiştirmeye çalışan yazılım geliştiriciler, büyük miktarda veri ile çalıştıkları zamanlarda uygulamanın ne kadar yavaş çalıştığından şikayet ederler.
Eğer string birleştirmeyi tek bir ifade içinde gerçekleştiriyorsanız (bir başka değişle, birleştirilecek string değişkenlerin sayısı belirliyse), String.Concat metodu çalıştırılır. Bu durumda performans kaybı yaşamayız çünkü gereksiz geçici nesneler oluşturulmaz. Dolayısıyla bu senaryoda bu çözüm oldukça efektiftir.
Ancak birleştirilecek string değişkenlerin sayısı belirli değilse, örneğin string birleştirme işlemini bir döngü içinde gerçekleştiriyorsanız, += ifadesi ile string birleştirme yapmak uygulamanız için ciddi performans kaybı anlamına gelecektir.
StringBuilder sınıfı 16′lık varsayılan kapasite ile oluşturulur. Eğer bu değerden daha fazla değer eklemek isterseniz, StringBuilder sınıfı sizin için o anki boyutunun 2 katı oranında bir alanı rezerve eder. Ancak bu senaryoda += ifadesini kullanırsanız, döngünün her adımında bir geçici nesne oluşturulacağından işlem süresi artacaktır.
Aşağıdaki kodu çalıştırdığımız zaman işlem süresi 5,282 Saniye olarak gerçekleşiyor.
string result = String.Empty;
DateTime startTime = DateTime.UtcNow;
for (int i = 0; i < 35000; i++)
{
result += r.Next(10000, 99999);
}
DateTime endTime = DateTime.UtcNow;
Ancak kodu aşağıdaki şekilde değiştirdiğim zaman işlem süresi 0,11 Saniyeye düşüyor.
StringBuilder sb = new StringBuilder();
string result = String.Empty;
DateTime startTime = DateTime.UtcNow;
for (int i = 0; i < 35000; i++)
{
sb.Append(r.Next(10000, 99999));
}
result = sb.ToString();
DateTime endTime = DateTime.UtcNow;
Sanıyorum bu basit örnek bile, bu basit ayrıntının büyük ölçekli projelerde ne kadar büyük bir performans farklı yaratacağını göstermek için yeterli olmuştur.
May 1, 2008 at 8:24 pm · Filed under İpuçları (.NET)
DateTime karşılaştırmalarında veya hesaplamalarında, DateTime.Now özelliği yerine DateTime.UtcNow özelliğini kullanmanın performans üzerinde olumlu etkisi olacaktır. Bunun nedeni, DateTime.UtcNow özelliğinin işlemleri culture-neutral gerçekleştiriyor olmasıdır.
Örneğin aşağıdaki kod bloğunda DateTime.Now özelliğini kullandığım zaman işlem 4,998 saniyede tamamlanıyor.
DateTime startTime = DateTime.UtcNow;
for (int i = 0; i < 10000000; i++)
{
DateTime result = DateTime.Now;
}
DateTime endTime = DateTime.UtcNow;
Ancak for döngüsünün içindeki DateTime.Now ifadesini DateTime.Now ile değiştirdiğim aşağıdaki kod blığunun çalışması 0,301 saniyede tamamlanıyor.
DateTime startTime = DateTime.UtcNow;
for (int i = 0; i < 10000000; i++)
{
DateTime result = DateTime.UtcNow;
}
DateTime endTime = DateTime.UtcNow;
Büyük ölçekli projelerde bu özelliğin oldukça sık kullanıldığını dikkate alacak olursak, toplamda uygulama performansını ciddi oranda etkileyebilecek bir ipucu olarak dikkate alabiliriz.
Not: İşlem süreleri kendi kullandığım 2,4 Ghz Macbook Pro için geçerlidir. Farklı konfigurasyonlarda ve işlem esnasında bilgisayarda çalışan uygulamalara bağlı olarak, işlem sürelerinde değişiklikler olacaktır.
May 1, 2008 at 7:45 pm · Filed under İpuçları (.NET)
ToLower metodu geçici string nesneleri oluşturduğu için, Case Insensitive karşılaştırma yaparken, ToLower() metodunu kullanmaktan kaçınmak için Compare metodunu kullanmak uygulama performansını olumlu yönde etkileyecektir.
Aşağıdaki kod, case insensitive karşılaştırma işlemini gerçekleştirmesine karşın, kullanılan ToLower() metodları yüzünden geçici string nesneleri oluşturarak uygulama performansını olumsuz yönde etkilemektedir:
String str=“KADİR SÜMERKENT”;
String str2 = “Kadir Smerkent”;
if (str.ToLower()==str2.ToLower())
{
// işlemler
}
Bu işlemi daha yüksek performanslı bir şekilde gerçekleştirmek için aşağıdaki kodu kullanabiliriz:
String.Compare(str, str2, true);