Performansı ne zaman önemsemeliyim?


16

Java'nın IRC kanalı , SO ve diğer yerler gibi yerlerde uzun bir süre boyunca bana "Kodun nasıl göründüğü ve okunabilirliği / anlaşılabilirliği ve kesinlikle gerekliyse daha sonra performans" konusunda endişeleniyorum. En uzun süredir, küçük masaüstü veya web uygulamalarımın performansı hakkında gerçekten OKB olmadım, sadece verimsiz olanı ortadan kaldırdım.

Çoğu yanıt "Ölçeklenebilirlik ne olacak?" Bu meşru bir nokta, ancak uygulamam sadece 10.000 satır uzunluğundaki dosyaları ayrıştırmak için oluşturulduysa, kodumu 1.000.000 satır dosyasında kıpırdayacak insanların küçük bir yüzdesi için bir karmaşa haline getirmeli miyim?

Asıl sorum, işleri son derece hızlı yapan ancak bir sonraki geliştirici tarafından kodun aşırı derecede zor ve yeniden yazılmaya meyilli olmasını mümkün kılan büyük dev karmaşık hayvanlar için görevleri yapmanın kolay ama biraz verimsiz yollarını ne zaman ticaret yapmalıyım?

Yanıtlar:


23

Sorun haline geldiğinde performanstan endişe edin.

10.000 satır dosyasını işlemek için küçük bir uygulama yazarsanız ve her 100'üncü dosyada 1.000.000 satır dosyası alırsanız, büyük olasılıkla bu dosyayı işlemenin daha uzun sürmesi önemli değildir. Ancak, düzenli olarak başlangıçtan 5-10 kat daha büyük dosyalar alıyorsanız ve uygulamanızın işini yapmak çok uzun sürüyorsa, profil oluşturma ve optimize etmeye başlarsınız.

Şimdi "işini yapmak için çok uzun" dedim. Buna karar vermek kullanıcının veya sponsor kuruluşun görevidir. Bir görev yapıyorum ve yazılım olmadan veya farklı bir araçla beni 3 aldığında bir şey yapmam 5 dakika sürüyorsa, bunun iyileştirilmesi için muhtemelen bir hata raporu veya bakım isteği gönderirim.

Kullanıcı sizseniz, yazılımınızın işini ne kadar sürede yapmasını istediğiniz size bağlıdır - yalnızca daha hızlı yapılmasını isteyip istemediğinize veya daha okunabilir kod için daha uzun süre beklemek isteyip istemediğinize karar verebilirsiniz.



Profil oluşturmaya ve optimizasyona başlıyorum 1) iş uzun sürerse 2) donanım kaynaklarından biri maksimumdadır (örn.% 100 işlemci)
A. Binzxxxxxx

10

Asıl sorum, işleri son derece hızlı yapan ancak bir sonraki geliştirici tarafından kodun aşırı derecede zor ve yeniden yazılmaya meyilli olmasını mümkün kılan büyük dev karmaşık hayvanlar için görevleri yapmanın kolay ama biraz verimsiz yollarını ne zaman ticaret yapmalıyım?

Bu genellikle yanlış bir ikiliktir . Mükemmel derecede verimli, okunabilir ve bakımı kolay bir kod yazabilirsiniz. Harika verimsiz, sürdürülemez karışıklık yığınları yazabilirsiniz.

Performans sorunları ile uğraşırken genellikle çözdüğüm iş sorununu düşünmeye çalışırım. Müşterilerim kullandığında yazılımım nasıl davranacak? Uygulama performansım Jacob Nielsen'i mutlu edecek mi?


5
++ YANLIŞ DICHOTOMY! Hiç öğrenmeyecekler mi? Bir performans sorunu bulup çözdüğünüzde, kod sadece daha hızlı değil, daha iyidir . Sadece bir pişmanlık duyduğum için üzgünüm!
Mike Dunlavey

Her zaman değil, genellikle genellikle yanlış bir ikilik olduğunu yazmak için +1.
Dan Rosenstark

1
-1 yazmak için genellikle yanlış bir ikiliktir - gerçek şu ki, genellikle doğrudur ve sadece nadir durumlarda yanlış bir ikiliktir. Programlama kariyerimin 30 yılı aşkın süredir, kodun anlaşılmasını ve bakımını zorlaştıran çok fazla "iyi tasarlanmış" performans optimizasyonu gördüm (ve genellikle optimize edilmesi gerekmeyen bir şeyi optimize etti).
Doc Brown

5

Üniversitede benimle kalan mikroişlemciler üzerinde çalıştığım bir gerçekçilik: "Sık karşılaşılan vakayı hızlı yap. Yaygın olmayan vakayı düzelt."

Kodunuzu kullanması amaçlanandan daha büyük iki büyüklükte girişle boğucu kullanıcılarınızın küçük bir yüzdesine sahip olduğunuz sürece, terlemeyin. Girdiyi yeterince uzun verirlerse doğru şekilde işlediğinden emin olun ve işi bitirmeden öldürürlerse işe yaramazlığa yol açan hiçbir şeyi bırakmayın.

Ancak, bir kez daha insanlar bunu bu şekilde kullanmaya başlıyorlar (ya da "Bilirsiniz, haftalık TPS raporlarımda yazdığınız aracı kullanmayı çok isterdim, ama bu çok garip 'günler"), performans kazançları için bakım kolaylığı üzerinden işlem yapmayı düşünmeye başlarsınız.


1

Asıl sorum, işleri son derece hızlı yapan ancak bir sonraki geliştirici tarafından kodun aşırı derecede zor ve yeniden yazılmaya meyilli olmasını mümkün kılan büyük dev karmaşık hayvanlar için görevleri yapmanın kolay ama biraz verimsiz yollarını ne zaman ticaret yapmalıyım?

"Kodun nasıl göründüğü ve şimdi okunabilirliği / anlaşılabilirliği ve daha sonra kesinlikle gerekli olması durumunda performans konusunda endişe edin" kolay çıkış yoludur ve genellikle yararsızdır. iyi bir tasarımın bakımı kolay, okunması kolay ve verimli olacaktır.

performans iyi bir tasarımın ortak bir bileşenidir. programınız yavaş ve boşa harcanıyorsa, gerçekten tekrar kullanılamaz. bu karmaşayı düzeltmeniz gerektiğinde , güncelleştirmeleri için çok zaman ayırmadıkça, istemcilerinizde güncellemeleri zorlarsınız. bu yavaş program, iyileştirilmesi çok pahalı olan büyük karışıklık haline gelir. o zaman kendi ihtiyaçlarına uygun olmayan bir alternatif seçerler. kötü bir tasarıma yönelik iyileştirmelerin yan etkilerini teşhis etmek, güncellemek ve bunlarla başa çıkmak genellikle verimli, doğru çalışmak ve genel olarak iyi bir tasarıma sahip olmak için yazmanın ilk geliştirme süresinden daha ağır basar. bu program yeniden kullanılabilir ve düşük bakım gerektirir (kazan).

bu nedenle, sorunuzun kısa cevabı "israf etmeyin. yeniden kullanım için yazın. Kavramların kanıtlarını prototiplendirirken / geliştirirken tembel olmak sorun değil, ancak bu prototipi üretim kodu için kullanmayın."

yeniden kullanmak istediğiniz üretim programları ve programları yazarken savurgan tasarımların farkında olun ve bunlardan kaçının. uygulama sırasında israf etmemek için programınızı yazmak için ideal zamandır - ayrıntılar ve işleyişi hakkında net bir fikriniz vardır ve yazıldıktan sonra düzeltmek gerçekten acı verici ve etkisizdir. birçok insan sonunda biraz profilleme (belki) veya bir sorun yeterli ise, yeniden tasarlamak / değiştirmek için çok zaman harcadığında ve verimsizlikler o kadar yaygın ve programı anlayamayacağınıza inanıyorlar. bir profilin sonuçlarına dayanır. bu yaklaşım uygulama sırasında çok az zaman alır ve (bunu yeterince kez yaptığınızı varsayarsak) tipik olarak birkaç kat daha hızlı olan ve daha birçok bağlamda tekrar kullanılabilen bir tasarımla sonuçlanır. savurgan olmamak, iyi algoritmalar seçmek, uygulamalarınızı düşünmek ve doğru uygulamaları yeniden kullanmak iyi tasarımın bileşenleridir; hepsiokunabilirliği, bakımı ve iyileştirmeyi incitmekten daha sık geliştirir.


0

Kodu okunabilir hale getirmeye çalışıyorum - performans zarar görüyor.

Ne zaman ve eğer kod çok yavaş olduğunu kanıtlarsa, daha hızlı olması için yeniden düzenleyeceğim. Kodun daha az okunabilir olma eğiliminde olması nedeniyle genellikle yeniden düzenleme işlemi çok sayıda yorum ile takip edilir.


0

Um - Asla?

Ciddi olarak, kod her zaman kolayca anlaşılabilecek ve korunacak şekilde yazılmalıdır.

Performans sorunlarıyla ne zaman başa çıkılacağı konusunda, bunları belirledikten sonra onlarla ilgilenin, kodunuzu önceden optimize etmeyin, çünkü o zaman performans sorunlarının nerede olduğunu tahmin edersiniz.

Kodunuz açık, özlü, anlaşılabilir ve bakımı kolay olacak şekilde yazıldıysa, siz veya başka bir programcının kodu daha verimli hale getirmek için yeniden düzenleme konusunda herhangi bir sorunu olmamalıdır.


3
Buna katılmıyorum. Performans gereksinimi, bir sistem için geçerli, işlevsel olmayan bir gereksinimdir.
Thomas Owens

Teknik olarak, açıkça tanımlanmış bir performansla ilgili gereksinim varsa, bir performans sorunu belirlediğiniz ve bunu çözümünüzde hesaba katmanız gerektiği söylenebilir. Bahsettiğim şey, spesifik olmayan 'potansiyel' problemlerden kaçınabilmeniz için önceden akıllı olmaktır.
Noah Goodrich

Ah. Evet, bu durumda kesinlikle haklısın. Olasılıklar için endişelenmiyorsunuz çünkü çok fazla var, ama bildiklerinize odaklanın.
Thomas Owens

0

Normalde her şeyden önce okunabilir kod yazıyorum. Programın işini yapmak için çok yavaş çalıştığını görürsem, profil oluşturup optimize ederim. Bununla birlikte, kodunuzun okunabilirliğini etkilemeyen ortak optimizasyon yapma alışkanlığına girmenin yanlış bir yanı yoktur. Yani, bir kod parçası eşit (veya neredeyse eşit) okunabilir iki şekilde yazılabilirse, genellikle daha hızlı olan kodu seçin.

Örneğin, Python'da, liste anlaşmaları (veya jeneratör ifadeleri) eşdeğer fordöngüden daha hızlı olma eğilimindedir , bu nedenle okunabilirliği etkilemezlerse (örneğin, liste anlayışlarını iç içe geçirmem Bundan kaçınabilir ve bunun yerine bir for döngüsü kullanabilirim çünkü iç içe liste kavrayışları zihinsel olarak ayrıştırmak zor olabilir).

Benzer şekilde, değiştirilemez veri türleri değişebilir olanlardan daha hızlı olma eğilimindedir, bu yüzden yapabileceğim değişmez veri türleri kullanıyorum.


0

Performans açısından kritik öneme sahip alanlarda çalışıyorsanız, verimliliği sonradan düşünülemez. Bu durumlarda erken tasarım yaparken ve nihai sonucun sürdürülebilirliği ile ilgili şekillerde düşünülmesi gereken en kritik şeylerden biridir.

Büyük ölçekli bir sunucu tasarlayamaz ve uygulayamazsınız ve sadece her bir istemci isteğini işlemeden işlemek için tüm sistemi kilitleyen küresel bir iş parçacığı kilidiyle her şey için engelleme işlevlerini kullanan kolay, iyi belgelenmiş bir kod yazmaya başlayabilirsiniz. paylaşılan durum, iş parçacığı çekişmesi ve eşzamansızlık hakkında ne düşündüğünü. Bu bir felaket tarifi ve denemenin bir sonucu olarak yarış koşulları ve kilitlenmelerle boğulmuş, bakımı en zor kod tabanına yol açabilecek şekilde yazdığınız güzel belgelenmiş kodun büyük kısmını yeniden tasarlama ve yeniden yazma ihtiyacıdır. sadece verimli, basit, çalışan tasarımları önceden düşünmüş olmanın aksine, gerekli görsellikte verimliliği artırmak.

Bir oyun geliştirme ekibi 8 ay üretime devam ediyor ve motor en yoğun donanımlarında saniyede 2 kare çekiyor ve 32 çekirdekli, aynı zamanda ekran her meşgul olduğunda 15 saniye durma eğilimi gösteriyor. küçük bir yerel hotspot düzeltiyor. Muhtemelen tasarımları, çizim tahtasının destansı bir revizyonunu ve kod tabanının her köşesine yayılabilecek tasarım değişikliklerini garanti edecek şekilde FUBAR olmasıdır.

John Carmack ile bir kez bir teknoloji demosunun üretime entegre edilmesi için saniyede en az yüzlerce ila binlerce kare arasında nasıl çalışması gerektiğini anlattı. Verimlilikle ilgili sağlıksız bir saplantı değil. Müşterilerin kabul edilebilir bulması için oyunların bütünüyle 30+ FPS'de çalışması gerektiğini açıkça biliyor. Sonuç olarak, yumuşak bir gölge sistemi gibi küçük bir özellik 30 FPS'de çalışamaz, aksi takdirde oyun bir bütün olarak gerekli gerçek zamanlı geri bildirimi sağlayacak kadar hızlı olamaz. Bu var kullanışsız gerekli verimi ulaşana kadar ısıtılır. Verimlilik için temel bir gereksinimin olduğu böyle performans açısından kritik alanlarda, yeterli hıza ulaşamayan bir çözüm aslında hiç çalışmayan bir çözümden daha iyi değildir,. Verimliliği konusunda baskın bir düşünce oluşturmadıkça, gerçek zamanlı bir oyun motoru için gereken şekilde saniyede yüzlerce ila binlerce kare hızında çalışan verimli bir yumuşak gölge sistemi tasarlayamazsınız. Aslında, bu gibi durumlarda, işin% 90 + 'ı verimlilik etrafında yönlendirilir, çünkü yol izlemeyi kullanarak kare başına 2 saatte iyi çalışan yumuşak bir gölge sistemi bulmak önemsizdir, ancak ayarlamayı bekleyemezsiniz. yaklaşımda tamamen farklı bir değişiklik olmadan saniyede yüzlerce karede koşmaya.

Verimlilik bir uygulamanın tasarımının temel bir parçası olduğunda, görmezden gelerek tasarruf ettiğinizden çok daha fazla zaman kaybetmeden, gezide verimlilik elde etmeyi bekleyemezsiniz, çünkü arka planda çalışan bir tasarıma ulaşmayı bekleyemezsiniz. Kimse " Tasarım hakkında düşünmeyi ertelemem sorun değil. Sadece kodunuzu iyi bir şekilde belgeleyin ve daha sonra uygun bir tasarım yapabilirsiniz ." Ancak, performans açısından kritik mimarilerde, çok fazla özen göstermez ve etkili tasarımları önceden düşünmezseniz etkili bir şekilde yapıyorsunuz.

Bu, uygulamalarınızı yarasadan mikro ayarlamanız gerektiği anlamına gelmez. Uygulama ayrıntıları için, tasarımın değişmesi gerekmemesi şartıyla ölçümden sonra daha hızlı çözümlere doğru yinelenecek çok yer vardır ve genellikle bu konuda en verimli yol budur. Ancak tasarım düzeyinde, tasarım ve mimarinin en başından itibaren verimlilikle nasıl ilişkili olacağına dair yeterli düşünceyi koymanız gerektiği anlamına gelir.

Buradaki en önemli fark tasarım. Tasarımlar bağımlılıkları biriktirdiği için tasarımlarda tasarımlarda büyük değişiklikler yapmak kolay değildir ve tasarım değişirse bağımlılıklar bozulur. Ve bir tasarımın makul derecede verimli olması veya bazı durumlarda kalitesinin büyük ölçüde verimliliği ile ölçülmesi gereksinimi varsa, sonradan düşünülen olarak uygun bir tasarıma ulaşmayı beklememelisiniz. İster işletim sistemleri ister derleyiciler, video işlemciler veya raytracers veya oyun motorları veya fizik motorları olsun, verimliliğin kalitenin büyük bir yönü olduğu herhangi bir rekabetçi ürünle, verimlilik ve veri sunumları hakkındaki düşünceler en başından beri titizlikle düşünülmüştür. Ve bu gibi durumlarda verimliliği çok fazla düşünmek için erken optimizasyon olmaz. Böyle bir düşünceyi tam olarak en verimli zamanda ortaya koyuyordu,

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.