Optimizasyon ne zaman erken değildir ve bu nedenle kötü değildir?


75

"Erken optimizasyon tüm kötülüklerin köküdür" neredeyse hepimizin duyduğu / okuduğu bir şeydir. Ne tür bir optimizasyonun erken olmadığını merak ediyorum, yani yazılım geliştirmenin her aşamasında (yüksek seviye tasarım, ayrıntılı tasarım, yüksek seviye uygulama, ayrıntılı uygulama vb.) Karanlık tarafa geçmeden ne kadar optimizasyon yapabileceğimizi düşünelim.



Yanıtlar:


116

Bunu tecrübeden mahrum bıraktığınızda? Kötülük değil. “X'i her yaptığımızda, acımasız bir performansa maruz kaldık. Bu sefer X'i tamamen optimize etmeyi veya önlemeyi planlayalım.”

Nispeten ağrısız olduğunda? Kötülük değil. "Bunu Foo veya Bar olarak uygulamak da çok fazla iş gerektirecek, ancak teoride, Bar çok daha verimli olmalı. Hadi Barlayalım."

Korkunç bir şekilde ölçeklendirilecek berbat algoritmalardan kaçınırken? Kötülük değil. “Teknik liderimiz, önerilen yol seçim algoritmamızın faktoring zamanında çalıştığını söylüyor; bunun ne anlama geldiğinden emin değilim, ancak düşünmek için bile seppuku vermeyi öneriyor.” Başka bir şey düşünelim. ”

Kötülük, çok fazla zaman harcamaktan ve gerçekte var olmadığını bilmediğiniz problemleri çözmekten gelir. Sorunlar kesinlikle mevcut olduğunda veya hayali psudo sorunları ucuza çözüldüğünde kötülük ortadan kalkar.


Steve314 ve Matthieu M. , göz önünde bulundurulması gereken yorumlardaki puanları artırmaktadır. Temel olarak, bazı "ağrısız" optimizasyon çeşitlerine basitçe değmez çünkü sundukları önemsiz performans yükseltmesi kod gizlemeye değmez, derleyicinin zaten gerçekleştirdiği geliştirmeleri veya her ikisini de çoğaltır. Çok zekice yapılan iyileştirmelerin bazı güzel örnekleri için yorumları görün.


22
Bazen, hayali bir problemi kolayca çözmek, kod okumayı zorlaştırmak, zor okumak için zorlanabileceğinden, hala kötüdür. Çok zor değil (ya da kolay bir çözüm olmazdı), ama belki de bazen hala alakalı. Bir örnek, bazı insanların tanımayacağı ve derleyicinin muhtemelen işe yarayacaksa muhtemelen uygulayacağı akıllıca bir bit hilesi kullanıyor olabilir.
Steve314

26
Burada Steve ile aynı fikirdeyim, bazen "optimizasyon" buna değmez, özellikle de derleyiciler çok iyi olduğu için. Örnek ? eğer iimzasızsa, i / 2ile değiştirilebilir i >> 1. Bu daha hızlı. Fakat aynı zamanda daha şifrelidir (herkes etkiyi görmez, hatta yapanlar zaman kaybedebilir). Ama en kötüsü, derleyicinin yine de yapmasıdır, peki neden kaynak kodunu gizleyelim;)?
Matthieu M.

19
@Larry: Yapmadım, sanırım bu iyi bir örnek.
Joris Meys

18
Benim görüşüme göre, optimizasyonlar, hatta basit olanlar bile, kodun uygunluğunu / korunmasını etkilediklerinde ve gerçek performans ölçümlerine dayanmadıklarında, kötülük olarak kabul edilmelidir .
Bart van Ingen Schenau

14
@Matthew: Onlara ne öğretin? Kirli ve gereksiz hileler? Neden? Eğer profilleme bir olduğunu gösterir i/2gerçekten sıcak nokta ve olmasıdır (inanılmaz ama en varsayalım) i>>1daha hızlı kılan, bu yüzden bunu yapmak ve bu profil bu hızlı olduğunu göstermiştir etmesin bir yorum koydu. Bu gerçekten herhangi bir yere ihtiyaç duyuyorsa (ki, şüpheliyim, çünkü, Matthieu’nun söylediği gibi, derleyiciler bunu yapacak kadar akıllı olmalılar), yeni başlayanlar bir şey öğrenecekler, eğer değilse (muhtemelen) Gereksiz folklorlu kafaları?
sbi

38

Uygulama kodu yalnızca gerektiği kadar iyi olmalı, ancak kitaplığın nasıl kullanılacağını asla bilemediğinizden, kitaplık kodu mümkün olduğu kadar iyi olmalıdır. Bu nedenle, kütüphane kodu yazarken, performans, sağlamlık veya başka bir kategori olsun, her açıdan iyi olması gerekir.

Ayrıca, uygulamanızı tasarlarken ve algoritmalar seçtiğinizde performansı düşünmeniz gerekir . Performans gösterecek şekilde tasarlanmadıysa, hiçbir korsanlık performansı daha sonra gösterilemez ve hiçbir mikro-optimizasyon daha üstün bir algoritmaya göre daha ağır basmaz.


5
Kütüphane kodu "mümkün olduğunca iyi" olup olmayacağını veya amacının ne olduğunu belgelemelidir. Kodun, tüketicilerin yalnızca uygun olduğunda kullanması koşuluyla, faydalı olması için kesinlikle optimal olması gerekmez.
supercat

1
Üzgünüm, ama "her açıdan iyi ol" şüpheli mühendisliğe benziyor. Artı, muhtemelen gerçekçi değil - hayat her zaman değişimlerden ibarettir.
sleske

1
Tasarım aşamasını vurgulamak için +1; Eğer kasıtlı olarak faydalarını tarıyorsanız, erken değildir.
Nathan Tuggy

Tersine, kütüphanenizin nasıl kullanılacağını asla bilmiyorsanız, onu geliştirmek için zaman harcamanın hiç bir ticari değeri olup olmadığını bilmiyorsunuz. Yani bu pek tartışılmaz.
RemcoGerlich

25

ne tür bir optimizasyon [erken] değil

Bilinen sorunların sonucu olarak ortaya çıkan tür.


17

Optimizasyon ne zaman erken değildir ve bu nedenle kötü değildir?

Neyin iyi neyin kötü olduğunu söylemek zordur. Kim bu hakka sahip? Doğaya bakarsak, genlerimizin yavrulara geçmesini de içeren geniş bir "hayatta kalma" tanımıyla hayatta kalma için programlanmışız gibi görünüyor.

Dolayısıyla, en azından temel fonksiyonlarımız ve programlamaya göre, optimizasyonun üreme hedefi ile aynı hizada olduğu zaman kötü olmadığını söyleyebilirim. Çocuklar için, sarışınlar, esmerler, kırmızı kafalar, çok sevimli. Kızlar için, erkekler var ve bazıları iyi görünüyor.

Belki de bu amaca yönelik olarak optimizasyon yapmalıyız ve orada bir profiler kullanmaya yardımcı oluyor. Profil oluşturucu, sıcak noktalar ve neden oluştukları hakkında ayrıntılı bilgi vermenin yanı sıra, optimizasyonlarınızı ve zamanınızı daha etkili bir şekilde önceliklendirmenize izin verecektir. Bu size üreme ve arayışı için harcanan daha fazla boş zaman verecektir.


3
Birinin bu eski kestaneye yeni bir şeyler getirdiğini görmek canlandırıcı. Tek gereken, Knuth'un tüm teklifini okumak ve sadece bir cümleyi okumak, ha?
Robert Harvey,

1
@RobertHarvey Ben orada bir evcil hayvan peeve biraz var - o kadar çok sadece bir cümle alıntı gibi görünüyor, ve çok önemli bağlamsal bilgi sürecinde kaybolur sona erer. Biraz huzursuz olduğum için bu kadar iyi bir cevap olduğundan emin değilim. :-D

14

Tam alıntı optimizasyonu prematüre olmadığında tanımlar:

İyi bir programcı, böyle bir nedenden ötürü rahatlama şansını yitirmeyecek, kritik koda dikkatlice bakmak akıllıca olacaktır; ancak bu kod tanımlandıktan sonra . [vurgu madeni]

Kritik kodu birçok yolla tanımlayabilirsiniz: kritik veri yapıları veya algoritmalar (örneğin, yoğun olarak kullanılan veya projenin "çekirdeği") büyük optimizasyonlar sağlayabilir, birçok küçük optimizasyon profilerler aracılığıyla tanımlanır, vb.


6
Evet ... Rastgele bir işlev çağrısının gerçekleştiği zamanın% 90'ını traş etmek tamamen iyi ve güzel, ancak uygulamanızın zamanının% 80'ini harcadığı koda bakarak belki de daha büyük bir etki elde edersiniz. orada yüzde birkaç.

11

Her zaman deneyimlerinize dayanarak her durumda "yeterince iyi" bir çözüm seçmelisiniz.

Optimizasyon deyimi, gerçekten gerekli olduğunu bilmeden önce "daha hızlı hale getirmek için" yeterince iyi "den daha karmaşık kod yazmayı ifade eder, bu nedenle kodu gerekenden daha karmaşık hale getirir. Karmaşıklık işleri zorlaştıran şeydir, bu yüzden bu iyi bir şey değil.

Bunun anlamı, süper bir kompleksin seçilmemesi gerektiğidir, basit bir sıralama ne zaman yapılacağı zaman "rutini diske kaydırarak 100 Gb dosyaları sıralayabilir" sıralamasını yapar, ancak ilk önce basit sıralama için de iyi bir seçim yapmalısınız. Kör Kabarcık Sıralaması'nı seçerek veya "tüm girişleri rastgele seç ve sıralı olup olmadıklarına bak." nadiren iyidir.


3

Genel kural kuralım: Optimizasyona ihtiyacınız olacak emin değilseniz, istemediğinizi varsayalım. Ancak, optimize etmeniz gerektiğinde aklınızda bulundurun. Olsa da, ön hakkında bildiğiniz bazı konular var. Bu genellikle iyi algoritmalar ve veri yapıları seçmeyi içerir. Örneğin, bir koleksiyondaki üyeliği kontrol etmeniz gerekirse, bir tür ayarlanmış veri yapısına ihtiyacınız olacağından emin olabilirsiniz.


3

Tecrübelerime göre, detaylı uygulama aşamasında cevap kodun oluşturulmasında yatmaktadır. Neyin daha hızlı olması gerektiğini ve neyin kabul edilebilir hızlı olduğunu bilmek önemlidir.

Performans darboğazının tam olarak nerede olduğunu bilmek de önemlidir - kodun bir kısmını optimize etmek, toplam sürenin yalnızca% 5'ini alır ve bu da işe yaramaz.

Adım 2 ve 3, erken olmayan optimizasyonu açıklar:

  1. Çalışmasını sağla
  2. Ölçek. Yeterince hızlı değil? Profili ver .
  3. 2. adımdaki verileri kullanarak, kodun en yavaş bölümlerini optimize edin.

0 adımını unutmuşsunuzdur: Uygulamayı doğru bir şekilde tasarlayın, böylece baştan makul bir performans bekleyebilirsiniz.
Robert Harvey

Sadece ayrıntılı uygulama aşaması hakkında konuşuyordum.
Gorgi Kosev

1
Adım 3'ü sorguluyorum - çoğu zaman en iyi cevap farklı bir yaklaşım bulmaktır, bu nedenle ilk önce yavaş kod parçasını yapmazsınız.
Loren Pechtel

1
Doğru veri yapılarını seçin.
jasonk

3

Donanım platformu gibi değiştirilmesi zor olan şeyleri seçerken optimizasyon olmaz.

Veri yapılarını seçmek iyi bir örnektir - hem işlevsel hem de işlevsel olmayan (performans) gereklilikleri karşılamak için kritiktir. Kolayca değiştirilemez ve yine de uygulamanızdaki diğer her şeyi yönlendirir. Veri yapılarınız hangi algoritmaların kullanılabilir olduğunu vs. değiştirir.


3

Bu soruya cevap vermenin sadece bir yolunu biliyorum ve bu performans ayarlamada deneyim kazanmak. Bunun anlamı - programlar yazmak ve yazıldıktan sonra, içlerinde hızlandırmaları bulmak ve yinelemeli olarak yapmak. İşte bir örnek.

İşte çoğu insanın yaptığı hata: Programı gerçekten çalıştırmadan önce optimize etmeye çalışıyorlar. Onlar programlamada bir ders almış varsa onlar büyük-O renkli gözlük olacak ve onlar bu kadar ne düşünecek (değil bir profesör aslında çok pratik deneyime sahip) tüm ilgili . Hepsi aynı sorun, önceki optimizasyon. **

Biri şöyle dedi: Önce doğru yapın, sonra hızlı olun. Onlar haklıydı.

Ama şimdi vuruşçu için: Bunu birkaç kez yaptıysanız, daha önce yaptığınız aptalca şeylerin hız sorunlarına neden olduğunu anlarsınız, böylece içgüdüsel olarak onlardan kaçınırsınız. (Sınıf yapınızı çok ağır hale getirmek, bildirimlere maruz kalmak, fonksiyon çağrıları boyutlarını zaman maliyetleriyle karıştırmak, liste uzayıp gitmek gibi şeyler…) İçgüdüsel olarak bunlardan kaçınırsınız, ama daha azına nasıl göründüğünü tahmin edin. deneyimli: erken optimizasyon!

Böylece bu saçma tartışmalar devam ediyor :)

** Söyledikleri başka bir şey, artık endişelenmenize gerek yok, çünkü derleyiciler çok iyi ve makineler bugünlerde çok hızlı. (KIWI - Demirle Öldürün.) Üstel yazılım yavaşlamalarını (bu şekilde düşünen programcılar tarafından yapılır) telafi edebilecek bir üssel donanım veya sistem hızlandırması yoktur (çok akıllı çalışkan mühendisler tarafından yapılır).


2

İhtiyaçlar veya piyasa özellikle talep ettiğinde.

Örneğin performans çoğu finansal uygulamada bir zorunluluktur çünkü düşük gecikme çok önemlidir. İşlem yapılan cihazın yapısına bağlı olarak, optimizasyon yüksek seviyede bir dilde kilitleme yapılmayan algoritmalar kullanmaktan, düşük seviyeli bir dil kullanmaya ve hatta donanımın kendisinde sıra eşleştirme algoritmalarını (örneğin FPGA kullanarak) kullanmaya kadar gidebilir. ).

Diğer örnek, bazı gömülü aygıt türleri olabilir. Örneğin ABS frenini alın; öncelikle güvenlik var, mola çarptığınızda arabanın yavaşlaması gerekir. Ama aynı zamanda performans var, mola verdiğinizde herhangi bir gecikme istemezsiniz.


0

Çoğu kişi, performans nedeniyle sistemin "yumuşak bir başarısızlığına" (işe yaramasına rağmen hala işe yaramaz) neden olmayan bir şeyi optimize ediyorsanız optimizasyon erken denir.

Gerçek dünyadan örnekler.

  • Baloncuk dizilimin çalışması 20ms sürerse, 1ms quicksort'a optimize etmek,% 2000 performans artışı olmasına rağmen, genel programı hiçbir şekilde anlamlı şekilde geliştirmeyecektir.

  • Bir web sayfasının yüklenmesi 20 saniye sürerse ve onu 1 saniyeye düşürürsek, web sitesinin faydası 0'dan sonsuzluğa kadar artabilir. Temel olarak, çok yavaş olduğu için kırılmış olan bir şey şimdi yararlıdır.


Sıralamanız programınız boyunca 1000 kez çağrılırsa, 20ms'den 1ms'ye optimize etmenin çok önemli olduğunu unutmayın.
Beefster

0

Ne tür bir optimizasyon erken değildir?

Uygulamanızla ilgili bilinen bir performans sorununu gideren bir optimizasyon veya uygulamanızın iyi tanımlanmış kabul kriterlerini karşılamasını sağlayan bir optimizasyon.

Tespit edildikten sonra, düzeltmenin kurulması için biraz zaman alınmalı ve performans yararı ölçülmelidir.

(yani değil - "Kodun bu bitinin yavaş gibi göründüğünü düşünüyorum, bunun yerine Y'yi kullanması için X'i değiştireceğim ve bu daha hızlı olacak").

Sonunda kodu yavaşlatan birçok erken "optimizasyon" ile karşılaştım - bu durumda, 'düşünülmeyen' anlamına gelmek için erken alıyorum. Performans, optimizasyondan önce ve sonra kıyaslanmalı ve yalnızca tutulan performansı geliştiren bir kodla karşılaştırılmalıdır.


0

"Erken optimizasyon tüm kötülüklerin köküdür" neredeyse hepimizin duyduğu / okuduğu bir şeydir

Doğru. Maalesef, aynı zamanda, tüm zamanların en kötü (kötüye kullanılan) programlama alıntılarından biridir. Donald Knuth, memeyi kullandığından beri, alıntıdan bazı orijinal bağlamlar eklemeye değer:

Küçük etkinlikleri unutmalıyız, zamanın% 97'sini söyleyelim: erken optimizasyon tüm kötülüklerin kaynağıdır. Yine de bu kritik% 3'teki fırsatlarımızı kaçırmamalıyız. ... İyi bir programcı ... kritik koda dikkatlice bakmak akıllıca olacaktır; ancak bu kod tanımlandıktan sonra. ... ölçme araçlarını kullanan programcıların evrensel deneyimi, sezgisel tahminlerinin başarısız olmasıydı.

Knuth'un özellikle çalışma zamanında yürütme hızından bahsettiğini unutmayın .

..Programcılar , programlarının kritik olmayan kısımlarının hızını düşünerek veya endişelendirip çok fazla zaman harcarlar .

Ayrıca, 1974'te, yürütme hızı ile programın sürdürülebilirliği (daha yüksek hız - daha az bakım gerektirmeyen) arasında birinci sınıf ve negatif korelasyon bulunan herhangi bir makine kaynağının muhtemelen şimdi daha güçlü olduğu makaleyi yazdı.

Tamam, sorunuza cevap vermek için, Donald Knuth'a göre, tanımlanmış olan ciddi bir performans darboğazını düzeltirse (en iyisi ölçülür ve tespit edilir) optimizasyon erken değildir .

Daha önce de söylediğim gibi, "erken optimizasyon" en kötü şekilde kötüye kullanılan memlerden biridir, bu nedenle erken erken optimizasyon olmayan, bazen de bunlardan vazgeçilen bazı örnekler olmadan cevap tamamlanmayacaktır:

  • Çıplak gözle görülebilen ve O (N) 2 gibi büyük N'li veri tabanına gidiş dönüş sayısı gibi tanıtılmadan önce önlenebilecek darboğazlar;

Dahası, çalışma zamanı yürütme hızıyla ilgili değil:

  • düşünceli açık tasarım

  • statik yazma (!)

  • vb. / Her türlü zihinsel çaba

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.