it-swarm.asia

Temiz okunabilir kodu vs hızlı okunması zor kod. Çizgiyi ne zaman geçmeliyim?

Kod yazdığımda her zaman kodumu olabildiğince temiz ve okunabilir yapmaya çalışırım.

Her zaman ve sonra çizgiyi geçmeniz ve daha hızlı hale getirmek için Nice temiz koddan biraz daha çirkin koda gitmeniz gereken bir zaman geliyor.

Bu çizgiyi geçmek ne zaman uygun olur?

67
Ken Cochrane

Çizgiyi aştığında

  • Kodunuzun amaçlanan kullanımı için çok yavaş olduğu ölçülen var.
  • Kodu çözmeyi gerektirmeyen alternatif iyileştirmeleri denediniz.

İşte gerçek dünya örneği: Çalıştığım deneysel bir sistem çok yavaş veri üretiyor, çalışma başına 9 saatten fazla sürüyor ve CPU'nun yalnızca% 40'ını kullanıyor. Kodu çok fazla karıştırmak yerine, tüm geçici dosyaları bir bellek içi dosya sistemine taşıdım. 8 yeni çirkin olmayan kod satırı eklendi ve şimdi CPU kullanımı% 98'in üzerinde. Sorun çözüldü; çirkinlik gerekmez.

118
Norman Ramsey

Bu yanlış bir ikilik. Kodu hızlı bir şekilde yapabilirsiniz ve bakımı kolaydır.

Bunu yapmanın yolu, özellikle olabildiğince basit bir veri yapısı ile temiz yazmaktır.

Daha sonra zaman drenajlarının nerede olduğunu öğrenirsiniz (çalıştırarak, after daha önce değil, yazdınız) ve bunları tek tek düzeltin. (İşte bir örnek.)

Eklendi: Her zaman, zaman ve bellek arasındaki bir takas veya hız ile sürdürülebilirlik arasındaki bir takas gibi, ödünleşmeleri duyuyoruz mu? Bu tür eğriler mevcut olsa da, verilen herhangi bir programın eğri üzerinde ve hatta yakınında herhangi bir yerde olduğu varsayılmamalıdır.

Eğri üzerindeki herhangi bir program (belirli bir programcıya vererek) kolayca hem daha yavaş hem de daha az bakım yapılabilir hale getirilebilir ve daha sonra eğrinin yakınında hiçbir yerde olmayacaktır. Böyle bir program daha sonra hem daha hızlı hem de daha sürdürülebilir hale getirilmesi için bolca alana sahiptir.

Deneyimlerime göre, birçok program burada başlıyor.

58
Mike Dunlavey

OSS varlığımda, arayanın veri yapısına (yani kütüphaneye harici), (tasarım gereği) derinden bağlı performansa yönelik bir çok kütüphane çalışması yapıyorum. gelen tipler üzerinde herhangi bir yetki yoktur. Burada, bu performant yapmanın en iyi yolu meta-programlamadır (ki .NET-karadayken beri) IL-yayar demektir. Bu çirkin, çirkin bir kod, ama çok hızlı.

Bu şekilde, kütüphane kodunun uygulama kodundan daha "çirkin" olabileceğini kabul ediyorum, sadece becuase girişleri üzerinde daha az kontrole sahip olabilir (veya belki de hayır). Ya da geçen gün ifade ettiğim gibi:

"delilik uçurumunu kodlamak, bu yüzden "

Şimdi uygulama kodu biraz farklıdır, çünkü "düzenli" (aklı başında) geliştiriciler tipik olarak işbirlikçi/profesyonel zamanlarının çoğuna yatırım yaparlar; her birinin hedefleri ve beklentileri (IMO) biraz farklıdır.

IMO, yukarıdaki hızlı ve bakımı kolay olabileceğini gösteren cevaplar, geliştiricinin daha fazla kontrole sahip olduğu uygulama koduna atıfta bulunmaktadır. veri yapıları üzerinden yapılıyor ve meta programlama gibi araçlar kullanmıyor. Bununla birlikte, farklı delilik seviyeleri ve farklı ek yük seviyeleri ile meta-programlama yapmanın farklı yolları vardır. Bu arenada bile uygun soyutlama seviyesini seçmelisiniz. Ancak, aktif, olumlu, gerçekten beklenmedik verileri mutlak en hızlı şekilde işlemesini istediğinizde; çirkinleşebilir. Bununla başa çıkın; p

31
Marc Gravell

Kodun profilini oluşturup kodun gerçekten önemli bir yavaşlamaya neden olduğunu doğruladığınızda.

27
Joel Rein

Temiz kod, hızlı çalışan kodla özel olmayabilir. Normalde okunması zor olan kod, daha hızlı çalıştığı için değil, yazmaktan daha hızlı olduğu için yazılmıştır.

Daha hızlı hale getirmek için "kirli" kod yazmak tartışmasız akıllıca değildir, çünkü değişikliklerinizin gerçekten bir şey geliştirdiğinden emin değilsiniz. Knuth en iyisi:

"Zamanın yaklaşık% 97'sini küçük verimlilikleri unutmalıyız: erken optimizasyon tüm kötülüklerin köküdür. Yine de bu kritik% 3'teki fırsatlarımızı kaçırmamalıyız. İyi bir programcı böyle bir akıl yürütme ile gönül rahatlığına kapılmamak için, kritik koda dikkatlice bakmak akıllıca olacaktır; ancak ancak bu kod tanımlandıktan sonra. "

Başka bir deyişle, önce kodu temiz yazın. Ardından, sonuçta ortaya çıkan programı profille ve bu segmentin aslında bir performans darboğazı olup olmadığını görün. Öyleyse, bölümü gerektiği gibi optimize edin ve optimizasyonları açıklamak için çok sayıda belge yorumu (muhtemelen orijinal kod dahil) eklediğinizden emin olun. Ardından, gerçekten bir iyileştirme yaptığınızı doğrulamak için sonucu profille.

13
tylerl

Soru "hızlı okunması zor kod" yazdığından, basit cevap asla değildir. Kod yazmak için asla okunması zor bir bahane yoktur. Neden? İki sebep.

  1. Bu gece eve dönerken bir otobüse çarparsanız ne olur? Ya da (daha iyimser ve daha tipik olarak) bu projeyi çıkardınız ve başka bir şeye yeniden mi atadınız? Karışık kod karmaşanızla yaptığınızı düşündüğünüz küçük fayda, kimsenin anlayamadığı gerçeğinden tamamen ağır basmaktadır . Bunun yazılım projelerinde ortaya çıkardığı riskin abartılması zor. Bir kez büyük bir PBX üreticisi ile çalıştım (bir ofiste çalışıyorsanız muhtemelen masanızda telefonlarından birine sahipsiniz). Proje yöneticileri bana bir gün, standart bir Linux kutusunu tam özellikli bir telefon santraline dönüştüren özel yazılım olan ana ürünlerinin, şirketin içinde "damla" olarak bilindiğini söyledi. Artık kimse onu anlamadı. Her zaman yeni bir özellik uyguladılar. derlemeye çarptılar, sonra geri çekildiler, gözlerini kapattılar, yirmi kadar saydılar, sonra işe yarayıp yaramadığını görmek için parmaklarından içeri baktılar. Hiçbir işletmenin artık kontrol etmedikleri temel bir ürüne ihtiyacı yoktur, ancak korkutucu derecede yaygın bir senaryodur.
  2. Ama optimize etmeliyim! Tamam, bu yüzden bu sorunun diğer cevaplarındaki tüm mükemmel tavsiyelere uydunuz: kodunuz performans testi vakalarında başarısız oluyor , dikkatlice profillendirdiniz, darboğazları belirlediniz, bir çözüm buldunuz ... ve biraz bit-twiddling içerecektir. İyi: Şimdi devam edin ve optimize edin. Ancak işin sırrı (ve bunun için oturmak isteyebilirsiniz): optimizasyon ve kaynak kodu boyutunda azalma aynı şey değildir . Yorumlar, boşluklar, parantezler ve anlamlı değişken adları, okunabilirliğe büyük bir yardımcıdır, çünkü derleyici onları atar. (Veya JavaScript gibi derlenmemiş bir dil yazıyorsanız - ve evet, JavaScript'i optimize etmek için çok geçerli nedenler vardır - bunlara bir kompresör ile değinilebilir.) Uzun satırlar sıkışık, minimalist kod (muntoo'nun yayınladığı gibi burada ) optimizasyonla ilgisi yoktur: bu, mümkün olduğunca az sayıda karaktere kod yazarak ne kadar akıllı olduklarını göstermeye çalışan bir programcıdır. Bu akıllıca değil, aptalca. Gerçekten zeki bir programcı, fikirlerini açıkça başkalarına iletebilen bir programcıdır.
10
Mark Whitaker

Uzaklaşma kodu olduğunda. Yani, kelimenin tam anlamıyla: bir kerelik bir hesaplama veya görev yapmak için bir komut dosyası yazdığınızda ve böyle bir kesinlikle bildiğinizde, bu eylemi bir daha asla yapmak zorunda kalmayacaksınız, tereddüt etmeden 'rm kaynak dosyasını', sonra çirkin rotayı seçebilirsiniz.

Aksi takdirde yanlış bir ikiliktir - daha hızlı yapmak için çirkin hale getirmeniz gerektiğini düşünüyorsanız, yanlış yapıyorsunuz. (Ya da iyi kodun neyin revize edilmesi gerektiğine dair ilkeleriniz. Soruna doğru bir çözüm olduğunda goto kullanmak aslında oldukça zariftir.

4
maaku

Piyasadaki düşük performansın tahmini maliyeti, söz konusu kod modülü için tahmini kod bakım maliyetinden daha yüksek olduğunda.

İnsanlar hala elle kodlanmış SSE/NEON/vb. Bu yılın popüler CPU yongasında bazı rakiplerin yazılımlarını denemek ve yenmek için montaj.

3
hotpaw2

Uygun dokümantasyon ve yorumlarla okunması zor kodların anlaşılmasını kolaylaştırabileceğinizi unutmayın.

Genel olarak, istenen işlevi yerine getiren kolay okunur kod yazdıktan sonra profil. Darboğazlar, daha karmaşık görünmesini sağlayan bir şey yapmanızı gerektirebilir, ancak bunu kendiniz açıklayarak düzeltirsiniz.

3
Carlos

Bana göre bir istikrar oranı (betonda çimentolanmış, fırında pişmiş kil, taşla sabitlenmiş, kalıcı mürekkeple yazılmış). Kodunuz ne kadar kararsızsa, gelecekte kodunuzu değiştirme olasılığınız ne kadar yüksek olursa, üretken kalabilmek için ıslak kil gibi daha kolay bükülebilir olması gerekir. Ayrıca okunabilirliği değil esnekliği de vurguluyorum. Bana göre kod değiştirme kolaylığı, onu okuma kolaylığından daha önemlidir. Kodun okunması kolay ve değişmek için bir kabus olabilir ve eğer değişmek için bir kabussa uygulama ayrıntılarını okuyabilir ve kolayca anlayabilir? Sadece akademik bir alıştırma olmadığı sürece, genellikle bir üretim kod tabanındaki kodu kolayca anlayabilmenin amacı, onu gerektiğinde daha kolay bir şekilde değiştirmek niyetindedir. Değiştirilmesi zorsa, okunabilirliğin birçok faydası pencereden dışarı çıkar. Okunabilirlik genellikle esneklik bağlamında yararlıdır ve esneklik sadece kararsızlık bağlamında yararlıdır.

Doğal olarak, okunması ne kadar kolay veya zor olduğuna bakılmaksızın, akla gelebilecek en zor kodu bile değiştirmek için bir neden yoksa sorun yaratmaz, sadece kullanın. Ve böyle bir kaliteye ulaşmak, özellikle performansın genellikle en fazla sayma eğiliminde olduğu düşük seviyeli sistem kodu için mümkündür. Hala 80'lerin sonundan beri değişmeyen düzenli olarak kullandığım C kodu var. O zamandan beri değişmeye gerek yok. Kod çirkin, biraz karışık günlerde yazılmış ve bunu neredeyse anlayamıyorum. Yine de bugün hala uygulanabilir ve bol miktarda kullanım elde etmek için uygulamasını anlamam gerekmiyor.

Testleri iyice yazmak istikrarı artırmanın bir yoludur. Bir diğeri ayırmadır. Kodunuz başka hiçbir şeye bağlı değilse, değiştirilmesinin tek nedeni kodun kendisinin değişmesi gerektiğidir. Bazen az miktarda kod çoğaltma, artık başka bir şeyden tamamen bağımsız olan bir kod alırsanız, dengeyi değerli bir takas haline getirecek şekilde önemli ölçüde iyileştirmek için bir ayırma mekanizması olarak işlev görebilir. Şimdi bu kod dış dünyadaki değişikliklere karşı savunmasız. Bu arada 10 farklı harici kütüphaneye dayanan kodun, gelecekte değişmesinin 10 katı nedeni vardır.

Uygulamada bir başka yararlı şey, üçüncü taraf kütüphaneleri için yapabileceğiniz gibi, kitaplığınızı kod tabanınızın kararsız bölümlerinden ayırmak, hatta ayrı ayrı inşa etmektir (bu aynı şekilde en azından sizin tarafınızdan değil, takım). Sadece bu tür bir organizasyon insanların kurcalanmasını önleyebilir.

Bir diğeri minimalizm. Kodunuz ne kadar az yapmaya çalışırsa, iyi yaptığı şeyi yapması o kadar olasıdır. Monolitik tasarımlar neredeyse kalıcı olarak kararsızdır, çünkü daha fazla işlevsellik onlara eklendikçe, daha eksik görünüyorlar.

Ölüme mikro olarak ayarlanmış paralel SIMD kodu gibi, kaçınılmaz olarak değiştirilmesi zor olacak bir kod yazmayı hedeflediğinizde, stabilite birincil hedefiniz olmalıdır. Kodu değiştirmek zorunda kalmama olasılığınızı en üst düzeye çıkararak kodu korumanın zorluğuna karşı koyarsınız ve bu nedenle gelecekte de korumak zorunda kalmazsınız. Bu, kodun bakımı ne kadar zor olursa olsun bakım maliyetlerini sıfıra indirir.

0
user204677