Yansıtma: Yansıtma kullanmak hala “kötü” veya “yavaş” mı? 2002'den bu yana yansıma ile neler değişti?


21

İfadeler veya İfade Ağaçları ile uğraşırken, özelliklerde ve size sahip olduğunuz değerleri ayarlamak ve almak için yansımayı çok kullanıyorum. Yansımanın kullanımının gittikçe yaygınlaştığı görülüyor. Vb doğrulama için DataAnotations, Özellik ağır ORMs, gibi şeyler beni merak ettiniz: Ya mümkünse ben önlemek yansıması söylenmesi için kullanıldığında önce günler yıl ve yıldan beri değişti?

Peki ne değişti? Sadece makinelerin hızı mı? Yansımayı hızlandırmak için çerçevede değişiklikler yapıldı mı?

Yoksa gerçekten hiçbir şey değişmedi mi? Yansımayı kullanmak hala "kötü" veya "yavaş" mı?


2
Yansıma her zaman doğrudan aramalardan daha yavaş olacaktır, çünkü aradığınızı bulmak ve doğrulamak için birkaç adım uygulamanız gerekir.
Michael K

Her zaman kötüydü .... Elbette bazen başka seçeneğiniz yok, bu zamanların ne olduğunu bilmek programcıya kadar ve başka türlü önlemek.
Ramhound

Bir sayımda bir öğeyi çekmek için gettype ile bir Yansıma yapmak, Enum.Parse () ile bir istisna atmaktan 30 kat daha hızlıdır. Böylece yansıma bazen kazanır.
Brain2000

Yanıtlar:


16

Yansıma ne kötü ne de yavaş. Bu sadece bir araçtır. Tüm araçlar gibi, bazı senaryolar için çok değerlidir, diğerleri için çok değerli değildir.

Performans gerçekten bir sorunsa , her zaman FasterFlect gibi bir kütüphane kullanabilirsiniz .

İleri Okuma
Yansıma yetersizse, en uygun zaman hangisidir?


Ya da dynamic- görünüşe göre yansımadan daha hızlı bir büyüklük sırası.
Oded

1
Performans hiç sorun değil. Sadece 2002'de veba gibi düşünmeden yansıyan insanları hatırlıyorum. O zamandan beri nelerin değiştiğini merak ediyorum.
blesh

3
@blesh: Hiçbir şey. İnsanlar şimdi ona daha aşinadır ve bundan daha az korkmaktadır.
Robert Harvey

5
Burada "çimlerimden kurtulun" ve Lisp'in OOP var olmadan çok önce olduğunu söyleyebilirim ...
Michael K

Yeterince adil. Fark yaratan son on yıldaki makinelerde hız artışlarının olup olmadığını ya da aslında System.Reflection'da performansı artıran değişiklikler olup olmadığını merak ediyordum.
blesh

17

İnsanların yansımayı gereksiz yere kullanma konusunda ihtiyatlı olmasının nedeni performans değildir: evet, yansımayı kullanmanın bir yükü vardır, ancak çoğu zaman problemi çözmeden karşılaştırılabilir karmaşıklıkla farklı bir yaklaşım gerektirir ve bunu yapmasa bile yükü nadiren önemli (özellikle uygulama düzeyinde geliştirme için).

Yansımayı kullanarak, normalde kaynak kodu hakkında yapabileceğiniz bazı önemli varsayımlar bozulur ve "Tüm Referansları Bul" gibi araçlar güvenilir bir şekilde çalışmaz. Yansıma, temel olarak, derleyicinin zorladığı tür güvenliğinin çoğunu, örneğin C # ve bir tür sisteminin normal olarak derleyici hatalarına çevirip çevireceği programlama hatalarının çoğunu kaldırır, şimdi en iyi veya çok kötü hatalarda çalışma zamanı hataları haline gelir.

Öyleyse neden insanlar yansıma kullanıyor? Basitçe söylemek gerekirse, yukarıda açıklanan sorunlara rağmen, çok değerli bir araçtır. Yansıtma ile, dinamik programlamanın bazı faydaları C # gibi statik, kesinlikle yazılan bir dilde olabilir ve dinamik programlama dilleri son zamanlarda özellikle web programlama - PHP, Javascript ve oldukça belirgin Python alanında değerlerini göstermiştir. , hepsi dinamik yazmayı kullanır ve web programlama için uygun olduğunu kanıtlamıştır. Ancak dil hala C # olduğundan, uygulamanızın çoğunu kesin olarak yazılmış bir OOP deyiminde tutmayı ve dinamik davranışın yansıma ile gerçekten fark yarattığı küçük kısmı yazmayı seçebilirsiniz.

Tipik bir örnek, yöntemleri web hizmeti çağrıları olarak açmanız gerektiğinde (henüz .NET'te yerleşik olmayan bir protokol kullanarak). Katı tip OOP yaklaşımı işe yarıyor, ancak aşırı kısıtlayıcı ve sakar. Ancak, çağrıları yöntemlere ve anahtar / değer çiftlerini bağımsız değişkenlere eşlemek için yansıma kullanırsanız, böyle bir web hizmeti için sıhhi tesisatı bir kez yazabilir ve daha sonra istediğiniz herhangi bir sınıfta kullanabilirsiniz.


13

Yansıma, doğrudan çağrılardan hala önemli ölçüde yavaştır. İki şey değişti:

  • Çalışma zamanları, yansıtma mekanizmalarını optimize etti, böylece fark küçüldü
  • CPU'lar daha hızlı hale geldi, böylece küçük verimsizliklerin tolere edilmesi daha kolay

Birlikte, bu iki faktör, yansıma maliyetini rutin olarak kullanabileceğiniz noktaya (sürdürülebilirlik POV'sinden uygun olduğu) ve profilin size bunun bir darboğaz olup olmadığını söylemesini (ve olmayacak).


4
ne yazık ki, CPU'lar daha yavaş hale geldi - tipik olarak mobil cihazlarda ve insanların çalıştırılma maliyetleri nedeniyle sunucularından mümkün olduğunca fazla verim almaya çalıştıkları sunucu.
gbjbaanb

@gbjbaanb: Size mobil cihazlar vereceğim, ancak sunucuda, kodu optimize etmek yerine daha fazla donanım satın almak, vakaların büyük çoğunluğunda kabul edilen ve rasyonel bir seçimdir, çünkü sunucuları satın alma ve çalıştırma maliyetleri çok daha düşüktür. kod optimizasyon maliyetleri.
Michael Borgwardt

2
Bazı durumlarda, sunucu maliyetleri geliştirme maliyetlerinden önemli ölçüde ağır basar. Büyük ölçekli bir tarzda. Sunucular güçlendirilmiş olsa da, performans bir istemci makineye göre daha da kritik olabilir. Bu duruma göre senaryo.
Lord Tydus

1
@Lord Tydus: Tabii, ama tarif ettiğiniz durum nadir istisnadır.
Michael Borgwardt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.