90/10 program optimizasyon kuralının anlamı nedir?


67

Wikipedia göre, programın optimizasyonu 90/10 kuralı (İkinci paragrafa bakın “bir program yürütme zaman% 90 kod% 10 infaz harcanmaktadır” belirtiyor burada ).

Bunu gerçekten anlamıyorum. Bu tam olarak ne anlama geliyor? Uygulama süresinin% 90'ı kodun sadece% 10'unu çalıştırarak nasıl harcanabilir? Peki ya kodun diğer% 90'ı? Zamanın sadece% 10'unda nasıl yürütülürler?


50
Kodun bazı kısımları diğer kısımlardan daha sık uygulanabilir. Sonuçta döngüler bunun için var. Uygulamada, hemen hemen her zaman bazı kısımları yürütülür yolu diğerlerinden daha sık.
Kilian Foth

147
Yazılım proje süresi için 90/10 kuralını duyana kadar bekleyin: “Projenin% 90'ı ayrılan sürenin ilk% 90'ını alacaktır; Projenin son% 10'u ayrılan zamanın diğer% 90'ını alacak ”dedi.
Paul D. Waite

3
Buradaki karışıklık: "zaman yürütmek için harcanıyor". Düşünün a++; for(i=0;i<100;i++){b++;} for(i=0;i<100;i++){print(xyz);}. İlk for-loop'un ilk ifadeden çok daha fazla harcadığından emin olun, ancak ikinci for-loop, for-loop için ~ 1000x daha fazla zaman harcar ancak çalıştırmaz . Yazdırmayı beklerken harcıyor . Dolayısıyla, yürütmeye harcanan zaman ile kodun sorumlu olduğu zaman arasında bir fark var .
Mike Dunlavey

32
@ Paul_D._Waite Projenin% 90'ının zamanın% 90'ını aldığını, kalanların% 90'ının zamanın% 90'ını aldığını ve böylece hiçbir projenin olmadığı sonucuna yakınsak olmayan bir seri olduğunu düşündüm. Sonsuz zamandan daha az bir sürede hiç bitmemiş ya da tamamen bozulmuş.
nigel222

9
Pratik örnekler için, üzerinde çalıştığım bir kaç kod (bilimsel modeller) modeli okumak ve kurmak için büyük miktarda kod (~ 10K satır) kullandı, ardından gerçek hesaplamaları yapmak için birkaç yüz satır boyunca bir döngü yaptı. Ancak bu kısa döngü n ^ 4'tür (üç uzay boyutu binlerce zaman adımında yinelenmiştir), bu nedenle hesaplanması günler sürdü. Yani gerçek oran muhtemelen% 99 /% 1 gibi bir
şeydi

Yanıtlar:


184

Burada oyunda iki temel ilke var:

  • Bazı kodlar diğer kodlardan daha sık yürütülür. Örneğin, bazı hata işlem kodları asla kullanılamaz. Bazı kodlar yalnızca programınızı başlattığınızda yürütülecektir. Programınız çalışırken diğer kodlar tekrar tekrar çalıştırılacaktır.
  • Bazı kodların çalıştırılması diğer kodlardan daha uzun sürer . Örneğin, bir veritabanında bir sorgu çalıştıran veya internetten bir dosya çeken tek bir satır muhtemelen milyonlarca matematiksel işlemden daha uzun sürecektir.

90/10 kuralı kelimenin tam anlamıyla doğru değil. Programa göre değişir (ve belirli 90 ve 10 numaralarının herhangi bir temeli olduğundan şüpheliyim; birisi muhtemelen onları ince havadan çıkardı). Fakat mesele şu ki, programınızın daha hızlı çalışması için ihtiyacınız varsa, bunun gerçekleşmesi için muhtemelen sadece az sayıda satır olması önemlidir. Yazılımınızın yavaş kısımlarını tanımlamak çoğu zaman optimizasyonun en büyük parçasıdır.

Bu önemli bir içgörüdür ve yeni bir geliştiriciye karşı sezgisel görünen kararların çoğu zaman doğru olabileceği anlamına gelir. Örneğin:

  • Aptalca, basit bir şekilde işler yapıyor olsa bile, "daha iyi" hale getirmek için zaman ayırmaya değmeyeceğiniz birçok kod var . XYZ uygulaması için daha verimli bir arama algoritması yazabilir misiniz? Evet, ama aslında her değerin basit bir şekilde karşılaştırılması, binlerce değer olsa bile, önemli miktarda zaman alır. Yani buna değmez. Yeni geliştiricilerin gereksiz optimizasyonlardan kaçınmaları zor olabilir, çünkü lisans programlarında "doğru" (en verimli) algoritmasını yazmak için çok zaman harcandı. Fakat gerçek dünyada, doğru algoritma, yeterince hızlı çalışan ve çalışan herhangi bir algoritmadır.
  • Kodunuzu daha uzun ve daha karmaşık hale getiren değişiklikler yine de bir performans kazanması olabilir. Örneğin, FOO uygulamasında, sadece tek bir veritabanı çağrısından kaçınmak için yüzlerce satır yeni mantık satırı eklemek faydalı olabilir.

6
Özellikle, sıralama işlevleri gibi şeylerle ilgili olarak, aptal bir algo yapmak her durumda doğru olanı yapmak için çok daha hızlıdır (dev zamanında) ve zarif bir algoyu tamamen işlevsel ve hatasız yapmaktan daha kolaydır. (Acadamea dışında bir sıralama algo yazmak için tek neden, bir kütüphane inşa ediyorsanız veya bir platform olmadan bir platformda çalışıyorsanız…)
StarWeaver

5
Shouldioptimize.com linkini eklemeniz gerektiğini düşünüyorum :)
Ivan Kolmychek

13
Bence 90/10 tanınmış 80/20 Pareto Prensibi'nden geliyor. En.wikipedia.org/wiki/Pareto_principle
fernando.reyes

2
@ StarWeaver Süper verimli çeşitler yazmayı, boktan bir baloncuk dizisinden daha kolay veya daha kolay hale getiren dillerin, C ++ gibi önemli olmasının nedeni budur. Bu "önceden paketlenmiş" algoritmalar ve kodlar, kullanım noktasında karmaşıklığa neden olmadan gerçekten yoğun bir şekilde optimize edilebilir.
Yakk

6
@IvanKolmychek Bu site yanıltıcıdır. Elbette, bu tür bir maliyet analizi dikkate alınması gereken bir faktördür, ancak kullanıcı deneyimi gibi başka faktörler de vardır. İyileştirmeyerek çok para kazanabilirsiniz, ancak insanlar sitenizi hayal kırıklığına uğratırsa, çok fazla gelir elde edemezsiniz.
jpmc26

21

Bu bir doğa yasası değil, geniş deneyime sahip bir kuraldır. Aynı zamanda 80/20 kuralı olarak da bilinir ve sadece kaba bir yaklaşımdır.

Döngüler, Dallar ve diğer akış kontrolü.

Eğer if olan her bir yer, diğer branştan daha sık alınan bir kolunuz olacaktır. Bu nedenle yürütme süresinin daha fazlası, programın bu bölümünü yürütmek için harcanır, diğerini değil.

Bir kereden fazla çalışan bir döngüye sahip olan her yerde, çevreleyen koddan daha fazla yürütülen kodunuz olur. Böylece orada daha fazla zaman harcanır.

Örnek olarak, şunları göz önünde bulundurun:

def DoSomeWork():
    for i in range(1000000):
        DoWork(i)
    except WorkExeption:
        print("Oh No!")

Burada print("Oh No!")irade en fazla bir kere, en fazla bir kere, çoğu zaman asla değil, ancak DoWork(i)milyonlarca kez gerçekleşecek.


7
80/20 kuralı olarak adlandırmak, sadece programlamadan daha geniş bir şekilde uygulanan Pareto prensibi ile karışıklığa neden olabilir . Belki 90 ve 10, anlamsal örtüşmeye sahip olmayan uygun numaralardır.
trichoplax

29
Bu Pareto müdürünün bir örneği. Her iki sayı çifti de eşit derecede keyfi
Caleth

2
Pareto prensibindeki 80/20 bölünmesinin matematiksel bir temeli var. Sadece "çok" ve "biraz" temsil eden hayali figürler değiller.
Moyli

1
@Moyli - Evet, "80/20 bölmesinin matematiksel bir temeli var ...", fakat gerçek dünyada asla (Tamam, tesadüfen, nadiren) tam olarak 80/20 olmayacak.
Kevin Fegan

2
@trichoplax pareto prensibi burada çok iyi uygulanır. Nedenlerin% 20'si (kod satırları) etkilerin% 80'ine (çalışma zamanı) neden olur
njzk2

16

Döngüler.

Orada durmak için can atıyorum! :-)

Bu programı düşünün

1. do_something

2. loop 10 times
3.    do_another_thing

4.    loop 5 times
5.        do_more_stuff

Satır 1 bir kez yürütülürken, satır 3 10 kez yürütülür. Sırasıyla her satıra bakıyor

1 1   0.8%
2 10  8.3%
3 10  8.3%
4 50 41.3%
5 50 41.3%

İki satır yürütme süresinin% 83'ünü oluşturur (tüm satırların çalışması yaklaşık aynı zaman alırsa, programın% 40'ı>% 80 alır).

Daha büyük gerçek dünya örnekleri ile bu yükselir, bu nedenle çalışma süresinin büyük bir kısmını yalnızca az miktarda satır oluşturur.

90/10 kuralı (ya da bazen 80/20'de belirtildiği gibi) bir "temel kural" dır - sadece yaklaşık olarak doğru.

Ayrıca bakınız Pareto Prensibi


2
Bunun sadece yaklaşık olarak doğru olduğunu söylemek yerine, çoğu durumda, zamanın en az % 90'ının kodun çok küçük bir kısmını yürütmekle harcanacağını söyleyebilirim - en çok % 10'u. Açıkça görülüyor ki, tüm bölümlerin aynı zamanda yürütmek için harcadığı tüm bölümleri programlamak mümkün olacak, ancak bu nadir.
supercat

Pareto İlkesine atıfta bulunmak için +1. Bu fantastik Vsauce videosunda daha ayrıntılı bir açıklama yapılabilir .
Radu Murzea

5

Yalnızca yürütme süresi hakkında sorduğunuzda, bu örnek yardımcı olabilir:

int main() {
    sleep(90); // approximately 10% of the program.
    // other 90% of the program:
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    sleep(1);
    return 0;
}

Biraz daha ciddi olmak gerekirse, gerçek hayat kodunda neredeyse her zaman bir döngüde ağır bir işlev çağırdığınız anlamına gelir (bunun yerine sleep(90);), kalan zamanın% 10'unu da bazı tek geçişli hesaplamaları yaparsınız.

Başka bir örnek, bazı HA servislerinde hata işlemedir. Herhangi bir yüksek kullanılabilir servis, normal şartlar altında sonsuz bir süre çalışmak üzere tasarlanmıştır . Zamanın% 99'unda normal çalışır, ancak bazen bir hata olması durumunda, servisin kendisinden bile daha mantıklı karmaşık olabilecek bir hata işleme ve kurtarma işlemi yürütür.


Güzel, birisinin bu aşırı örneği göndereceğini umuyordum, bu farkı açıkça gösteriyor.
djechlin

3

90/10 akıl yürütme, kodunuzun küçük bir bölümünün diğerlerinden daha fazla tekrarlanacağı veya kullanılacağı anlamına gelir. Bu genellikle geliştirme / optimizasyon çabanızın% 90'ını kodunuzun% 10'una konsantre etmeniz gerektiğini önermek için kullanılır.

Microsoft Word veya OpenOffice gibi normal bir metin işlemcisini düşünün :

  • Tercihler iletişim kutusu çok fazla kullanılmaz;
  • Karakter çizen alt yordamlar her zaman kullanılır.

Bu deyiş aynı zamanda yönetim bilimlerinde de kullanılmaktadır ... Bu hayatın kendisinin bir dersidir ... Anlamı: Çabalarının çoğunu size daha fazla sonuç veren yerlere yoğunlaştırın.


6
Microsoft Word basitse, karmaşık bir örnek nedir?
Peter Mortensen

@ Anlamsız Peter Portensen.
Büyük Ördek

@PeterMortensen Emacs, belli ki.
muru

2

Bunun gibi bir program düşünün:

print "H"
print "e"
print "l"
print "l"
print "o"
for i=0 to 1,000,000
    print "How long now?"
next
print "B"
print "y"
print "e"

Burada 11 satırın 3'ünün for döngü olduğu, bu küçük kod parçası için ne kadar zaman harcandığına dikkat edin. Diğer 8 satır yalnızca tek bir karakter yazdırırken, biraz zor. Bu nedenle, bazı kodların kısa olmasına rağmen, bunun ne sıklıkta yürütüldüğünü ve ne kadar zaman alacağını söylemediğine dikkat edin.


0

Döngüye ek olarak, diğer büyük cevapların da belirttiği gibi, dikkate alınması gereken DRY ilkeleri de vardır. İyi yazılmış, Nesne Yönelimli kodun çok sayıda yeniden kullanılabilir kısmı vardır. Yeniden kullanılan parçalar, tanım gereği, yalnızca bir kez çalıştırılan bir şeyden en az iki kat daha fazla kullanılır. Çok fazla sayıda OO kodunuz varsa, birkaç sınıfı ve yöntemi birçok kez ve birkaç başka kod parçasını yalnızca bir kez yeniden kullanma olasılığınız olabilir.

Diğer cevaplarda da belirtildiği gibi, yalnızca bir kez kullanılan kodu iyileştirmekten daha sık kullanılan kodu daha iyi yapmak için çaba harcamak muhtemelen daha iyidir.


2
Çok fazla kodu tekrar kullanabilirsiniz, ancak bunların hepsi nadiren gerçekleştirilebilir (hala çok önemliyken).
Peter Mortensen

@PortMortensen "çok önemli fakat sıklıkla değil", "neredeyse her saniye yeniden kullanıldı ve mümkün olduğu kadar hızlı olması gerekiyor" ile aynı değil
The Great Duck

@ TheGreatDuck ve ben onun demek istediğini sanmıyorum. Çünkü nadiren yürütülen bir kodunuz olabilir , ancak olabildiğince hızlı olmasını istersiniz. Örneğin, hatayı düzeltelim. Uygulamaya bağlı olarak, sistemin yeniden çalışması için biraz zaman (5 dakika, bir saat, belki de daha fazla) almak iyi olabilir. Bununla birlikte, eğer bir uçuş sistemi bir hatayla karşılaşırsa, gerçekten mümkün olduğunca hızlı olmasını istersiniz. Çünkü eğer olmazsa, kelimenin tam anlamıyla "aşağı" ve "çarpışma" olacaktır.
VLAZ

Bu DRY'nin elbette doğru olmayan OO gerektirdiğini gösteriyor. Yeniden kullanımı, serbest işlevler, vb. Tarafından eşit olarak kolaylaştırılır
underscore_d

@vlaz doğru, fakat olay şu ki bir uçakta .... HER ŞEYİN hızlı koşması gerekiyor.
Büyük Ördek

0

Bu bir kural değil, sadece Wikipedia'dan bazılarını ince havadan çekip onu kural olarak adlandırmış olan bir dostum. Diğer bağlamlarda daha sıkı bir şekilde kurulan Pareto Prensibi ile karşılaştırın. Bu "kural" ın doğruluğu konusunda (eğer varsa) hangi araştırmaların yapıldığını görmek isterim.

Ancak temelde sorunuzun cevabı, bazı kodlar diğer kodlardan çok daha sık çalıştırılıyor. Döngüler genellikle bunun nedenidir. Diğer nedenler, zaman alan aramalardır; örneğin, web servisleri veya depolama ortamları gibi harici kaynaklar.


İnsanların bir kural olarak kullandıkları meşru bir şey.
Büyük Ördek

Bunun bir kural olarak yaygın kullanımda olduğunu öne sürüyorsanız, bunun için de kanıtlar görmek isterim! Yoksa bu, ince havadan çıkarılan ancak olgusal olarak ima edilen başka bir görüş mü?
Brad Thomas,

Eğer wikipedia makalesini okuduysanız , askere atıfta bulunulan alıntıda bu alıntıyı göreceksiniz: amazon.com/Every-Computer-Performance-Book-Computers/dp/… Kullanımda hiç şahsen görmedim, ancak göreviniz kaba ve çirkin geldi, ben de cevap verdim. Açıkçası% 10, birisinin oluşturduğu bir sayıdır. Programımı verimsiz hale getirerek istediğim sayıyı yapabilirim. Bununla birlikte, yazılım mühendisliğinde kullanılan bir terim olup olmadığı, buradaki kaç kişinin varlığını kabul ettiği konusunda açıkça tartışılmaz.
Büyük Ördek,

Pekala, sözde atıfta bulunduğu araştırmayı görmek için kitabı almaya gitmek istemiyorum ... kanıtı gösteren bir alıntı gönderebilir misiniz? Yoksa aslında hiç görmedin mi?
Brad Thomas,

1
@BradThomas: Vikipedi'yi düzenleyen biri tarafından 90-10 kuralının icat edildiğine dair teoriye dair kanıtlar, Vikipedi'nin varlığından yıllar önce 90 ve 10 sayılarla geniş çapta alıntı yapıldığı; gerçek ilke, kodun tam olarak% 10'unun çalışma zamanının% 90'ını oluşturması değil, çoğu programda kodun küçük bir kısmının (% 10 veya daha az) çalışma zamanının bu kadar büyük bir kısmının hesabını oluşturması değildir. -90% veya daha fazla olması, kodun bu küçük bölümünün performansındaki% 10'luk bir iyileşme bile, genel yürütme süresini, her şeyde 1000 kat iyileştirmeden daha fazla azaltacaktır.
supercat,

0

80/20 kuralı olarak da bilinen "birçok olay için, etkilerin yaklaşık% 80'inin nedenlerinin% 20'sinden geldiğini" belirten "Pareto prensibi" nin yeniden yorumlanmasıdır. Bu kural çoğunlukla ekonomiye uygulanır, bu nedenle programlama için kullanılması amaçlanmıştı.

Sadece uzun bir süre boyunca gözlemlenen bir kalıp.

İşte böyle kalıplar hakkında çok güzel bir video ve Pareto Prensibi'ni de açıklıyor.

https://www.youtube.com/watch?v=fCn8zs912OE&ab_channel=Vsauce

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.