2009-03-16 15 views
8

Kod bilgimi azaltmak için bu bilgiyi bilmek istiyorum, bu yüzden zamanımı boşa harcamam, derleyici veya JIT tarafından yapılacak işleri optimize et. örneğinC# derleyici veya JIT hangi seviyede uygulama kodunu optimize eder?

:

ben işlev çağrısını önlemek için yerel bir değişkene dönüş değeri kaydetmek gerekmez yüzden derleyici inline bir özelliğin get işlevine çağrı varsayarsak.

Neler olup bittiğini açıklayan iyi bir başvuru öneriyoruz.

cevap

18

Bu makalelerin bir göz atmak isteyebilirsiniz: Jit Optimizations: Inlining II (David Notario)

JIT Optimizations - (Sasha Goldshtein - CodeProject)
Jit Optimizations: Inlining I (David Notario)

Eğer mikro bu düzeyde ayrıntı hakkında çok fazla endişe edilmemelidir Dürüst olmak gerekirse. sizin için bu konuda derleyici/JIT'er endişe, bu hemen tüm olgularda olduğundan daha ona daha iyi olsun. Do Premature Optimisation kafayı alamadım.Kodunuzun çalışmasına odaklanın, daha sonra (a) yeterince hızlı çalışmadığında, (b) 'boyut' sorunlarınız varsa, daha sonra optimizasyonlar hakkında endişelenin.

17

Performans hakkında endişeli iseniz, bir profiler çalıştırın. Ardından, kodunu değiştirin. Şansınız, bir milyon yıl içinde asla zamanın geçtiği yerde% 100 doğru tahmin edemeyeceğinizdir. % 0.02 zamanlamasını değiştirebilir ve yükün% 62'sine katkıda bulunan yöntemi bırakabilirsiniz. Daha da kötüsünü yapabilirdin. Bir profiler ve kanıt olmadan, körsün.


Sen JIT bir özellik getter satır içi edeceğini üstlenmez olabilir. Yapabileceği ya da yapmayabileceği birçok sebep vardır; yöntem, vücut boyutu, vb referans tipi, mimari, bağlı hata ayıklayıcı vs sanal değeri

"kaldırma" hala bir yere sahiptir, ve yine de görmek kod sıkı bir döngüde sürekli olarak adlandırılır halinde elde edebilirsiniz; örneğin:

var count = list.Count; 
for(int i = 0 ; i < count ; i++) {...} 

(- bu bir dik tartışma yukarıda fr forforeach vs tartışmayı unutma). Yukarıdakilerde, "kaldırma" performansa yardımcı olacaktır. Ama sadece gerçekten kafa karıştırıcı olmak - tam tersi olduğunu ve değil vinç sayesinde daha verimlidir dizilerle o:

JIT bu tanır ve diziler sabit olarak (sınırları çek kaldırır
for(int i = 0 ; i < arr.Length ; i++) {...} 

boyut).

+0

Sonunu bilmiyordum! Bilmek güzel, teşekkürler! – Groo

+0

Bilgi için teşekkürler, ancak bu bilgi için iyi bir başvuru rica ediyorum –

+2

Benim amacım, * no * referansının size bu konuda yardımcı olacağıdır. Bir ** profiler ** olacak. –

1

Bu bakarak olmamalı mikro optimizasyon bir tür gibi görünüyor. Yanılmıyorsam Eğer optimizasyon tür uygulandığı CLR mimarisi ve sürümüne bağlıdır. senin yöntem o kadar çağrılırsa

ve gerçekten o satır içi istiyorum, kendinizi spagetti kod pahasına bunu satır içine alabilirsiniz.

Daha iyi bir algoritma saniye saatlerden koşu süresi azalma yapabilir iken, hız büyüklüğünü tasarruf olmaz bir yöntem satır içi senin algoritma analiz öneriyoruz.

-1

JIT tarafından gerçekleştirilen en güçlü en iyi duruma getirme tipik olarak satır aralığıdır. Bir JIT yüzlerce işlevi bile derinlemesine sıralayabilir (bu rakam JikesRVM için duydum). Hatta her zaman mümkün olmayan satır içi satırları hatta satır içi satır içi satırları bile dolduracaklardır (dinamik deoptimizasyon olarak adlandırılırlar).

Güzel bir genel bakış http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html.

Sorunuzdaki işlev çağrısı sıcak ise, özel sorunuzu yanıtlayabilirim.

İlgili konular