2010-03-14 19 views
16

WinForms C# konusundaki uzun açıklayıcı değişken adlarını performans için kullanıp kullanmayacağımı merak ettim. Bu soruyu AutoIt v3'te (yorumlanmış dil), veryLongVariableName yerine aa gibi kısa isimlerle değişkenlere sahip olmanın çok daha hızlı olduğu (program 5 liner daha büyük olduğunda) ortaya çıktığı için soruyorum. C# de aynı olup olmadığını merak ediyorum?Performans C# için değişken ad uzunluk maddesi var mı?

cevap

21

Hayır öyle değil. Derleyici aslında orijinal değişken isimlerini kaydetmez, herhangi bir derlenmiş montajın IL kodunu disassembler ile inceleyebilirsiniz.

+4

Bu garip çünkü benim kaynak eklediğimde yansıtıcı olan .exe ile kullandığım değişken isimleri gösterir. – MadBoy

+0

Doğru, ancak bir .NET derlemesindeki ara dil kodu, yürütülmeden önce makine diline çevrilmez mi? (Ayrıca cevabımı da görün.) Eğer öyleyse, değişken isimlerin hala mecliste olup olmadığı farketmez, çünkü gördüğünüz _not_ idam edilecek. – stakx

+2

Derleyici, değişken isimleri ve kodları gerçekten depolayan .pdb dosyaları da oluşturur. Ancak bu dosyalar yalnızca .NET uygulamalarının çalışmaması için hata ayıklama için kullanılır. Belki de Reflektör bu dosyaları okuyabilir. –

1

Hayır, bu uzun değişkenin bir .NET uygulamasının yürütme performansı üzerinde herhangi bir etkisi olduğunu düşünmüyorum. AFAIK, bir .NET derlemesindeki ara kod (MSIL içinde), çalıştırılmadan önce makine diline çevrilir. Bu, değişken adların kesinlikle "atılmış" (daha önce gerçekleşmemişse) olduğu ve basit bellek adresleriyle değiştirildiği yerlerde olacaktır.

+0

Böyle bir uygulamanın başlangıç ​​zamanı nedir? Daha kısa olur mu? – MadBoy

+0

Değişken adları MSIL'ye ulaşmıyor. –

+0

Eğer endişe duyuyorsanız, yanlış yerde optimize etmeye çalıştığınızı söyleyebilirim. Sonuçta, bir montaj sadece bir kez yüklenecektir (en azından normal durumlarda). Bu, 5 milisaniye daha fazla sürse bile, bu, uygulamanızın genel çalışma zamanı performansını gerçekten etkilemez. IMHO, iç döngülerin (birçok kez çalıştırılacak) performansı, verimsiz veri erişimi (HDD/DB erişimi, RAM bellek erişiminden daha yavaş _a lot_) vb. Hakkında daha fazla endişelenirdi. – stakx

1

Önemli değil. Eğer decompiling yaparken isimleri alabiliyor olsanız da (detaylar için diğer mesajlara bakın) bu isimler IL komutları tarafından kullanılmıyor veya değişkenlere/alanlara okuma. Değişkenler ve alanlar farklı bir yapıyla tanımlanır. Reflection.emit ad alanında bunlar LocalBuilder (alanlar için bir yerel değişken veya FieldBuild) tarafından temsil edilir ve noktayı daha da vurgulamak için kullanılır: Açıkça adlandırılmaları bile gerekmez.

15

Derleyici ile yorumlayıcı arasındaki önemli bir farktır. Bir yorumlayıcı, kodu yorumlarken bir tanımlayıcı adı araması yapar. Bu ad arama, birçok kez yürüten bir döngü içinde gerçekleşirse, bu arama için gereken süre önemli olabilir. Daha uzun isimler daha fazla zaman gerektirir.

C# derleyicisi, tanımlayıcı adlarını iki ayrı aşamada ortadan kaldırır. Yerel değişkenlerin adları silinir ve kaynak kodunu IL'ye derlediğinde yığın kare ofsetleri ile değiştirilir. Ad alanı ve ad adları derlemede hala mevcut. JIT derleyicisi, bunları alanlara yönelik yöntemler ve veri ofsetleri için kod ofsetleriyle değiştirir. Tanımlayıcı adlarının uzunluğu burada önemli değil, arama sadece bir kez gerçekleşir.

Tercümedeki giderlerin giderilmesinin bir yorumlayıcıda giderilmesi zor değil. Terbiyeli bir yorumcu, kaynak kodunu, aslında tercümanı daha verimli hale getirmek için bir ön-derleme adımını belirtmektedir. Böyle bir tercüman uzun tanımlayıcı isimlerle de yavaşlama sorunu yaşamazdı.

+0

Kabul edilen cevap olmalıydı. – ConfusedDeer

2

Hayır, bir kez derlendiğinde, orijinal değişken adları artık kullanılmamaktadır. Değişken adlarının büyüklüğü, derlenme süresinde çok küçük bir etki yapmalıdır, ancak yürütme süresinde değil.

Yorumlanan diller, biraz uzun değişken adlarından etkilenir. Uzun isimler, her koştuklarında okumak, saklamak ve aramak için daha fazla, ancak etki çok küçük olmalıdır. Bir diske okuma/yazmadaki gecikme süresi veya hatta ekran, daha uzun değişken adlarının neden olduğu gecikmeyi aşmalıdır.

Yürütme süresi sorunsa, daha fazla yürütme etkin algoritması, değişken adların kısaltılmasından neredeyse kesinlikle daha büyük dönüşler sağlayacaktır. Bellek baskısı sorunsa, bellek etkin algoritmalar, muhtemelen değişken isimleri kısaltmaktan çok daha fazla tasarruf sağlayacaktır. Eğer çözüm algoritmik olarak olabildiğince sıkıysa, yeni bir dilin zamanıdır.

Programlamada birkaç mutlak vardır, ancak performans nedenleriyle kaynak kodunda değişken adların kısaltılması, KESİNLİKLE her zaman yanlış kararın yanlış olduğunu söyleyerek kendime güveniyorum.

+0

Dim UnlessYouOftenUseVariableNamesThatAreSoLongThatTheyMayBeConsideredANovellaAllOnTheirOwn;) – ScottS

0

İsim uzunluğu ile ilgili soru, yalnızca Script# projeleri için geçerlidir (C# 'nin JavaScript'e çevrilmesi durumunda).

İlgili konular