2016-03-24 11 views
2

Bu soruna zaten birkaç kez rastlıyorum. Bir liste üzerinde yinelediğimi ve farklı şekillerde "bakmayı" isterim (listenin verileri, ayrıştırdığınız yola göre farklı şekilde yorumlanabilir). Bu sadece bir yinelemede yapılabilir, ancak kod karmaşık ve karmaşık görünebilir. Diğer yol ise, listede defalarca tekrarlamaktır; her görev için bir kez. Bununla devam ederdim, ama eğer liste çok büyük ve her bir iterasyon maliyetli performans açısından ne olurdu?
Özetlemek gerekirse, hiç daha iyidir:Birden çok yineleme veya karmaşık kod?

a) yineleme ve yalnızca bir görev) bir zamanlar
b her şeyi idare birden tekrarlamalar yapmak ve işlemek ben sabırsızlıkla bekliyorum her yineleme

cevaplarını dinliyorum.

+0

__a__ yapın ve her bir görevi, daha iyi bir yapı için listenin birim öğesiyle ilgili bir şey yapan bağımsız işlev/modüle sarın ve nesnelerin beklenmedik bir şekilde değiştirilmediğinden emin olun. Bu soru örnek kod olmaksızın ve bir dil belirtimi olmadan oldukça belirsizdir. – woozyking

cevap

1

İyi soru. Cevap, duruma bağlı".

Her şeyden önce, bir mimari belirtmediğinizi farkettim. Örneğin, bir GPU veya CPU üzerinde bir şeyler yaparsanız çok farklı bir fark yaratır - ve benzer şekilde farklı bir işlemci de farklı çalışır. Şimdilik bir Intel CPU'yu basitlik için kabul edeceğim ama bunu aklımda tutuyorum.

Bu soruyu "performance" etiketiyle işaretlediniz, bu yüzden bu soruyu nasıl yorumlayacağım. Performansa gelince, sadece bir tane altın standart var, ve bu bir ölçüt size doğruyu söyleyecektir. Bunun akılda tutulması gereken bazı kurallar vardır:

  • Ardışık veri erişimi rastgele erişimden daha iyidir. Bu hafıza modeli ve vectorization çalışmaları gibi şeylerle ilgili her şeye sahiptir.
  • Öngörülemeyen dallanma, potansiyel olarak performansınızı öldürebilir. Genellikle bu, her şeyi yapan tek bir monolitik işlev yaptığınızda olur.
  • Bir "yinelemede" küçük bellek bloklarını (örneğin, < = 4K) işleyebiliyorsanız, bu genellikle daha hızlıdır, çünkü bu, önbelleğinizden çalışmaya devam ettiğiniz anlamına gelir. Çok işlemeniz gerekiyorsa, önce karşılaştırmak için bir test çantası yazmak isteyebilirsiniz.

Şahsen Mike Acton'un videolarının doğru yüksek performans kodunun nasıl yazılacağı konusunda çok fazla bilgi verdiğini düşünüyorum. https://www.youtube.com/watch?v=rX0ItVEVjHc ve https://www.youtube.com/watch?v=GPpD4BBtA1Y izlemek için en önemli videolardır (bana sorarsanız gerçekten zaman ayırmaya değer).

1

Bu, kod kalitesi ve performans arasındaki bir ilişkidir. Genel bir cevap verilemez. Her iki seçenek de şartlara bağlı olarak geçerlidir.