'Kodu optimize etme' == 'verileri yapılandırma' ne zaman?


9

Ycombinator'un yakın tarihli bir makalesinde, büyük bir programcının ilkeleriyle bir yorum listeleniyor.

#7. İyi programcı: Kodu optimize ederim. Daha iyi programcı: Verileri yapılandırıyorum. En iyi programcı: Fark nedir?

Öznel ve çekişmeli kavramları kabul etmek - bunun ne anlama geldiğini bilen var mı? Yapıyorum, ama cevapları yatkın kılmak için bu soruyu daha sonra düşüncelerimle düzenlemek istiyorum.


2
Referansınızın listesi içinde birkaç harika öğe var. Teşekkürler.
DeveloperDon

Bu soru (sorduğum) bu alıntıdan da bahseden bir cevabı var: programmers.stackexchange.com/q/168013/15028
TCSGrad

Yanıtlar:


16

Ondan dokuz kez, kodunuzu / modellerinizi iyi yapılandırdığınızda, optimizasyon belirginleşecektir. Kaç kez bir eşekarısı yuvası gördünüz ve tamamen yetersiz buldunuz, yeniden yapılandırıldıktan sonra çok fazlalık son derece belirgin hale geldi.

Bir tasarımcı, eklenecek hiçbir şey kalmadığı zaman değil, götürülecek bir şey kalmadığında mükemmelliğe ulaştığını bilir. - Antoine de Saint-Exupéry

İyi yapılandırılmış bir sistem doğada minimal olacaktır ve minimum doğası nedeniyle optimize edilecektir çünkü ne kadar azı varsa, hedefine ulaşmak için ne kadar az olduğu ile doğrudan ilişkilidir.

Düzenleme: Diğer bu uzağa almış nokta üzerine açıklamak için, ayrıca kod ve veri arasındaki ilişkiyi tanımlayan ifadesini görmek tamamen doğrudur. Dolayısıyla bu ilişki şu şekildedir: Verilerinizin yapısını değiştirirseniz, değiştirilen yapıya uymak için kodunuzu değiştirmeniz gerekecektir. Kodunuzu optimize etmek istiyorsanız, kodunuzun verileri en iyi şekilde işleyebilmesi için verilerinizin yapısını değiştirmeniz gerekecektir.

Bununla birlikte, burada kaçınılması tamamen ayrı bir olasılık var ve YCombinator ile ilişkileri olan bu arkadaşın LISP homoiklik geleneğindeki AS verilerini kodlaması anlamına gelebilir. Bunu zihnimdeki anlam olarak tahmin etmek için bir streç, ama YCombinator, bu yüzden teklifin sadece LISPers'ın "En İyi Programcı" olduğunu söylediğini göz ardı etmem.


1
Bu, "veriler" ve "kod optimizasyonu ile verileri yapılandırma arasında nasıl bir fark olmadığı" anlamına gelmez. Kodun optimize edilmesi, bu bir tür kendini sindiren, turlama tamamlanmış, makine olmadığı sürece kötü verileri yeniden yapılandırmaz
Yeni İskenderiye

1
@NewAlexandria bahsedilen model "veri" dir. Genellikle, kötü kod ve kötü bir model el ele gider. Birini düzeltmek diğerini düzeltmeyi gerektirir.

1
@NewAlexandria Ben modellerinizi yapılandırmak için "veri" olarak yapılandırmak, benim açımdan sadece veri / kod yapılandırılması ile ilgili olduğunu, çünkü bir bütün olarak sistem parçası ve birbirine bağımlı oldukları. Her ikisini de iyi yapılandırmak için diğerinde de değişiklik yapılması gerekecektir, belki de aradığınız şeyden daha fazlası bu mu? Yapının ve optimizasyonun nasıl aynı olduğunu açıklamaya çalışıyordum, kod ve verilerin nasıl ilişkili olmadığını değil, belki de sizin için kafa karıştırıcı kısmı ise sorunuzu yanlış anladım?
Jimmy Hoffa

Konunun doğru duygusunu açıklığa kavuşturmaya en yakın olanı bu. Bunun nasıl çalıştığını kesinlikle biliyordum, ancak birisinin alıntı yaptığım soruda daha derin bir şey görmesini umuyordum.
Yeni İskenderiye

4

Yazarın verilerin yeniden yapılandırılmasının kodun yeniden yapılandırılmasına yol açtığını ima ettiğini düşünüyorum. Bu nedenle, verilerinizi sisteminizi optimize etme amacıyla yeniden yapılandırmanız, kodunuzu da optimize etmenize ve "fark nedir?" tepki.

"Mükemmel bir programcı" nın "fark nedir?" orada bazı farklar var: CPU önbelleğini daha iyi kullanmak için optimize etmeye çalıştığınızda, veri yapılarınızın düzenini aynı tutabilirsiniz, ancak bunlara erişme sırasınızı değiştirebilirsiniz. farkı.


İlginç bir şekilde, yapı ve optimizasyon arasındaki benzetmenin, kod ve veri arasındaki ilişki değil, ifadenin konusu olduğu izlenimi altındaydım, ancak ilişki konusunda kesinlikle haklısınız ve bunu da açıklıyor. Bir koan toplamak gibi hissediyor :)
Jimmy Hoffa

Bazen veri yeniden yapılandırması kodun yeniden yapılandırılmasına izin verir, ancak bazen bittiğinde, yeni kodun eski kodla çok az ortak noktası olduğunu düşünüyorum.
DeveloperDon

OTOH, verilerin önbellek boyutu için hizalanması büyük bir etki yaratabilir. ;-p
Macke

3

Bunun en açık örneğini düşünün - "kullanıcı verilerini aramak çok yavaş!"

Kullanıcı verileriniz dizine eklenmemiş veya en azından sıralanmamışsa, verilerinizin yeniden yapılandırılması hızlı bir şekilde kod performansını artırır. Veriler düzgün bir şekilde yapılandırılmışsa ve yalnızca koleksiyon üzerinden yineleniyorsa (dizinleri kullanmak veya ikili arama gibi bir şey yapmak yerine), kodun değiştirilmesi kod performansını artırır.

Programcılar problem çözücülerdir. Algoritmalar ve veri yapıları arasında ayrım yapmak yararlı olsa da, genellikle tek başına var olamazlar. En iyi programcılar bunu biliyor ve kendilerini gereksiz yere izole etmiyorlar.


1

En azından açıklama yapmadan yukarıda belirtilen ifadeye katılmıyorum. Kodlamanın bazı veri yapılarının kullanımını içeren faaliyet olduğunu görüyorum. Veri yapıları genellikle kodlamayı etkiler. Bence ikisi arasında bir fark var.

Yazarın son kısmı "En iyi programcı: İkisini de optimize ediyorum" şeklinde yazmış olması gerektiğini düşünüyorum .

Algoritmalar + Veri Yapıları = Programlar adlı harika bir kitap (en azından yayınlandığı zaman) vardı .


0

Kodu optimize etmek bazen hızı iki kat, bazen de on veya yirmi faktör kadar artırabilir, ancak bu kadar. Bu kulağa çok benziyor olabilir ve bir programın yürütme süresinin% 75'i, hızı kolayca iki katına çıkarılabilen beş satırlı bir rutinde geçiyorsa, böyle bir optimizasyon yapmaya değer olabilir. Öte yandan, kişinin veri yapıları seçimi, yürütme hızını birçok büyüklükte etkileyebilir. RAM'de depolanan 10.000.000 öğe doğrusal bağlantılı listede anahtarla veri aramak için süper optimize edilmiş kod çalıştıran modern hiper optimize edilmiş çok iş parçacıklı işlemci, oldukça basit kodlanmış iç içe karma tablo çalıştıran çok daha yavaş bir işlemciden daha yavaş olacaktır. Gerçekten, eğer veriler düzgün bir şekilde düzenlenmiş olsaydı, 1980'lerde bile

Bununla birlikte, verimli veri yapıları tasarlamak, kodu optimize etmekten daha karmaşık ödünleşmeler gerektirir. Örneğin, çoğu durumda, verilere en verimli şekilde erişilmesine izin veren veri yapılarının güncellenmesi (bazen büyüklük sıralarıyla), hızlı güncellemelere izin verenlerden daha az verimlidir ve en hızlı güncellemelere izin veren veriler en yavaş erişime izin verebilir. Ayrıca, birçok durumda, büyük veri kümeleri için en uygun olan veri yapıları, küçük veri kümeleri ile nispeten etkisiz olabilir. İyi bir programcı, bu rakip faktörleri çeşitli veri yapılarını uygulamak ve sürdürmek için gereken programcı süresi ile dengelemeye çalışmalı ve aralarında iyi bir denge kurabilmelidir.


0

Veri yapıları performansa göre bir çok şeyi yönlendirir. İdeal veri yapısı hakkında önceden düşünülmüş bir fikirle sorunlara uzun ve uzun süre bakabileceğimizi düşünüyorum ve bu düşünme bağlamında, iyimserliğin kanıtlarını (genellikle indüksiyonla) bile yaratabiliyoruz. Örneğin, bir diziye sıralı bir liste koyar ve bir öğe ekleme maliyeti gibi şeyleri değerlendirirsek, ortalama olarak her ekleme için dizinin 1 / 2'sini kaydırmamız gerekir. Her ikili arama için , oturum açma adımlarında eşleşen bir öğe bulabiliriz (veya bulamayacağız).

Alternatif olarak, veri yapısı hakkındaki kararımızı ertelersek ( erken optimizasyondan kaçınırız ) ve gelen verileri ve nerede kullanacağımızı, ne kadar büyük olduğunu, hangi gecikmelerin meydana geldiğini ve hangilerinin kullanıcılar için önemli olduğunu, ne kadar belleğe sahip olduğumuzu incelersek vs. bildiğimiz veya tasarlayabildiğimiz veri gösterimleriyle birlikte kullanılır.

Sıralama ve arama gibi bir alanda bilinecek çok şey var. Gerçekten büyük programcılar uzun zamandır bunun üzerinde çalışıyorlar. Bu sorunları iyi anlamak yararlıdır ve lisans veri yapıları sınıfını bitirdiğinizden daha fazla yöntem biliyorsanız harika bir şeydir. İkili ağaçlar , daha yüksek bellek kullanımı karşılığında eklemeler için üstün performans sağlayabilir. Karma tablolar daha da büyük iyileştirmeler sağlar, ancak yine de daha fazla bellek için. Bir sayı tabanı ağacı ve sayı tabanı sıralaması iyileştirmeleri daha da ileri taşıyabilir.

Verilerin yaratıcı yapılandırılması, bir sorunu yeniden şekillendirmeye yardımcı olabilir ve zor uygulamaları daha hızlı ve bazen imkansız görevleri mümkün kılan yeni algoritmaların kapısını açabilir.


0

Makalenin ne anlama geldiğini en iyi tahmin etmek için, herhangi bir programcının optimizasyon hakkında anlaması gereken konuşulmayan bir alt metin (makalede eksik gibi görünüyor) olduğunu varsayacağım :

  • optimizasyon yalnızca programı düzgün bir şekilde çalıştırıp çalıştırdıktan sonra gelir:
    • doğru çalışmasını sağlayın, ardından hızlı çalışmasını sağlayın
    • bu ilke Knuth'un maksimumu, "erken optimizasyon tüm kötülüğün köküdür"
  • optimizasyonun erken olmadığını belirlediyseniz ve optimizasyonda neyin gerçekten optimizasyon yapılması gerektiğini belirlemek için ve optimizasyon sırasında tekrar tekrar optimizasyon denemelerinizin ne gibi etkileri olduğunu söylemek için doğru şekilde ölçmeniz gerekir .
    • kodunuz geliştirilirse, profiler bu konuda arkadaşınızdır.
    • kodunuz üretimde çalışıyorsa, kodunuzu yazmalı ve bunun yerine günlük sisteminizle arkadaş olmalısınız.

Şimdi, ölçümleriniz, kodunuzda makinenin en fazla döngüyü nerede yaktığını size söyleyecektir. "İyi" bir programcı, alakasız parçaları optimize etmek için zaman kaybetmek yerine kodun bu kısımlarını optimize etmeye odaklanacaktır.

Ancak, sisteme bir bütün olarak bakarak ve makinenin daha az iş yapmasına izin vermenin bir yolunu bularak daha büyük kazançlar elde edebilirsiniz. Bu değişiklikler sıklıkla verilerinizin organizasyonunun yeniden işlenmesini gerektirir; böylece, "daha iyi" bir programcı kendini verileri yapılandırmaktan daha sık bulur.

"En iyi programcı", makinenin nasıl çalıştığına dair kapsamlı bir zihinsel modele, algoritma tasarımında iyi bir topraklamaya ve nasıl etkileştiklerine dair pratik bir anlayışa sahip olacaktır. Bu, sistemi entegre bir bütün olarak görmesini sağlar - kodu ve verileri optimize etmek arasında hiçbir fark görmez, çünkü bunları mimari düzeyde değerlendirir.


-1

En iyi programcı: Fark nedir?

En iyi programcı? Hayır. Berbat programcı. "Optimizasyon" kelimesinin, programcıların genellikle bellek veya CPU zamanını optimize etmeye çalıştığı şeyler anlamına geldiğini varsayıyorum. Bu anlamda, optimizasyon hemen hemen her diğer yazılım metriğinin tahliline aykırıdır. Anlaşılabilirlik, sürdürülebilirlik, test edilebilirlik, vb .: Bunların hepsi optimizasyon hedef olduğunda kısa bir süre alır - optimize etmeye çalışan şey insanın anlaşılabilirliği, sürdürülebilirliği, test edilebilirliği vb. Bir hız / alan optimal algoritması yazmak, geliştirici süresi açısından, bazı metin veya günlüklerde sunulan algoritmayı naif olarak kodlamaktan çok daha pahalıdır. Berbat bir programcı farkı bilmiyor. İyi biri yapar. En iyi programcı neyin optimize edilmesi gerektiğini tam olarak nasıl belirleyeceğini bilir ve bunu akıllıca yapar.

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.