Ana içeriğe atla

String.Empty ve "" karşılaştırması

benim için beklenmedik bir şekilde performans açısından kazanan string.empty!

bugün aşağıdaki örnekteki str1 ve str2 değişkenlerinin durumunu ve bir farkı olup olmadığını inceleyeceğiz.


class StringDeneme
{
static void Main()
{
string str1 = string.Empty;
string str2 = "";
}
}


yukarıdaki kodu console projesinde derleyip oluşan .exe'mizi ildasm ile incelediğimizde şu kodu görüyoruz:


.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 14 (0xe)
.maxstack 1
.locals init ([0] string str1, [1] string str2)
IL_0000: nop
IL_0001: ldsfld string [mscorlib]System.String::Empty
IL_0006: stloc.0
IL_0007: ldstr ""
IL_000c: stloc.1
IL_000d: ret
} // end of method Program::Main


str1 değişkenimize string [mscorlib]System.String::Empty değeri atanmış (ldsfld) yöntemiyle.
str2 değişkenimize "" değeri atanmış (ldstr) yöntemiyle.

msdn'nden ldsfld'nin açıklamasına baktığımızda: gelen değeri direkt olarak değişkene atadığını görüyoruz. yani str1 değişkenine direkt olarak string.empty değeri atanmış.

ldstr'nin açıklamasına baktığımızda ise: gelen değer için bir string objesi yaratılıp değişkene atandığını öğreniyoruz. yani str2 değişkenine atanmak üzere bir string objesi yaratılıyor.

.NET Reflector yardımı ile mscorlib içinden [mscorlib]System.String::Empty değerine baktığımızda ise string class'ının constructor'ında Empty değeri olarak "" atandığını görüyoruz.


static String()
{
Empty = "";
WhitespaceChars = new char[] {
'\t', '\n', '\v', '\f', '\r', ' ', '\x0085', '\x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', '​', '\u2028', '\u2029', ' ', ''
};
}


kodunu görüyoruz. Yani aslında str1 = "" demiş oluyoruz. bana string.empty yöntemi çok daha maliyetli geldi... demiştim fakat performans testlerim sırasında string.empty yönteminin hep daha performanslı olduğunu gördüm. bunun üzerine ldsfld ve ldstr'yi araştırınca ldstr'de string objesinin yaratılmasından ötürü bu farkın oluştuğunu öğrenmiş oldum.

performans testi sonuçları 10.000.000 deneme için şu şekilde, str2 = ""; ifadesini oluşturmak hep daha fazla zaman almış:


/* -------- Deneme 1 -------- */
Name Time (msec)
StringDeneme.str2 4.627,05
StringDeneme.str1 4.282,18
/* -------------------------- */

/* -------- Deneme 2 -------- */
Name Time (msec)
StringDeneme.str2 4.816,66
StringDeneme.str1 3.765,69
/* -------------------------- */


kaynaklar:
OpCodes.Ldsfld Field
OpCodes.Ldstr Field
OpCodes.Stloc Field
OpCodes.Nop Field
OpCodes.Ret Field

Yorumlar

Bu blogdaki popüler yayınlar

C# ile Yüz Bulma ve Tanıma

Aylardır uğraştığım yüz tanıma sistemi tezimi nihayet bitirdim.Lafı uzatmadan hemen yaptığım uygulamadan bahsedeyim. Öncelikle yaptığım yüz tanıma sistemini gerçekleştirmek için donanımsal ve yazılımsal olarak en düşük sistem gereksinimleri şunlar.  —Donanımsal Gereklilikler İşlemci:        Pentium III veya üstü Bellek:         128 MB Hard Disk:   4GB veya üstü Monitör:       14”SVGA          —Yazılımsal Gereklilikler İşletim Sistemi:                             Microsoft Windows NT/2000 veya üstü Paket:                           ...

Yüz Tanıma Sistemi - 2

PCA Algoritması ve Özyüzler Metodu PCA algoritması ve Özyüzler metodunun kısaca bir tarihçesine bakalım; Öz yüzler yaklaşımı ilk olarak Sirovich ve Kirby (Eigenfaces, Principal Component Analysis, PCA, 1987) tarafından kullanılarak yüzü etkin bir şekilde göstermek için uygulanmıştır. Temel bileşen analizi olarak da bilinen Karhunen-Louve genişlemesine dayanmaktadır. Bu, bilgi teorisinde veriyi kodlama ve kodunu çözmede iyi bilinen bir tekniktir. Bu kişiler yüz resimleri gruplarından başlayarak bu resimlerin temel bileşenlerini hesaplamışlardır. Daha sonra da öz vektörün sadece küçük parçalarının ağırlıklı birleşimini kullanılarak yüz resmini yeniden oluşturmuşlardır. (Kirby ve Sirovich, 1990) bu metotlarını 115 yüz resmi veri tabanında test ettiler ve yaklaşık olarak %3 yanılma (hata) payıyla bir yüzü yeniden oluşturmak için sadece 40 öz vektörün yeterli olduğunu göstermişlerdir. Bundan kısa bir süre sonra yüzün simetrisini dikkate alarak (örneğin bütün yüzlerde gözler, burun v.s....

OpenSSL

Öncelikle OpenSSL hakkında genel bir bilgi vermek gerekir. OpenSSL ile ilgili genel ve güzel bir yazı var onu paylaşıp daha sonra windows sistemi altında OpenSSL sertifikası nasıl üretilir ve diğer aşamalarını yazacağım. OpenSSL nedir? OpenSSL projesi güvenliği geliştirmek için çaba harcayan ticari, geniş özellikli ve açık kaynak kodlu, Güvenli Soket Katmanı (SSL v2/v3), İletim Seviyesi güvenliği (TLS v1) protokollerini uygulayan, çok güçlü genel amaçlı bir şifreleme kütüphanesidir. Bu proje bütün dünyada iletişim, plan ve OpenSSL araçlarını geliştirmek için interneti kullanan gönüllüler topluluğu tarafından yönetilir. Bilindiği üzere SSL sertifikaları global firmalar tarafından oldukça yüklü rakamlara (Ücretlere) üretiliyorlar. Aslinda bu sertifikaları kendimiz üretmek mümkün, bunun için kendiniz sertifika sunucusu kurabilir ve işletebilirsiniz. OpenSSL organizasyonu burada devreye giriyor, ve bir kaç küçük program ile kendi sertifikalarınızı üretmenize olanak veriyor. Neden o z...