Programcılar bugün için ne mikro-optimize ediyor? [kapalı]


14

"İyi ol 'günleri" ne geri dönersek, shareware'i arkadaşlar için disketlere kopyalayacağımızda, aynı zamanda adil bir montaj kullandık. Ortak bir "mikro-optimizasyon" uygulaması vardı, burada daha az bir talimatla ifade etmenin bir yolunu bulana kadar montaj hatlarına bakıp bakacaksınız. Matematiksel olarak imkansız olan bir deyiş bile vardı, " Her zaman bir talimat daha kaldırabilirsiniz. " Çalışma zamanı performansını küçük sabit faktörlerle değiştirmenin, bugün (çoğu) programlama için önemli bir sorun olmadığı göz önüne alındığında, programcılar bu mikro- optimizasyon çabaları başka yerlerde?

Başka bir deyişle, en iyi uygulama artık değerli bir şey eklemediği aşırı bir duruma götürülebilir mi? Bunun yerine zaman kaybetmek mi?

Örneğin: Programcılar yalnızca bir yerden çağrılan özel yöntemleri genelleştirmek için zaman harcıyor mu? Test senaryosu verilerini azaltarak zaman kaybı mı var? Programcılar (hala) kod satırlarını azaltmak konusunda aşırı endişe duyuyorlar mı?

Aşağıda aradığımın iki harika örneği var: (1) Doğru değişken adlarını bulmak için zaman harcamak, hatta her şeyi yeniden adlandırmak; ve (2) Küçük ve sürekli kod çoğaltmasının bile kaldırılması.


Bunun " Ne için optimizasyon yapıyorsunuz? " Sorusundan farklı olduğunu unutmayın , çünkü diğer programcıların en üst düzeye çıkardığı şeyleri soruyorum, çünkü bunların damgası "mikro" optimizasyonlar ve dolayısıyla verimli bir zaman kullanımı değil.



@Macneil, diğer programcıların ne için optimize ettiklerini bilmiyorum, ama bunun için fazla zamanım yok. İş arkadaşlarım da meşgul (Sadece 2 sentim).
İş

@ İş: Hiç kimsenin zamanını boşa harcadığını, hiçbir sebep olmadan kodu değiştirdiğini görmedin mi? Kendini şanslı say. Aşağıda iki harika örnek bulunmaktadır: Değişken isimleri ve küçük kod çoğaltma.
MacNeil'in

1
Şu anda ifade edildiği gibi soru bir gelişmedir. Yakın oylamayı kaldıramıyorum, ancak birkaç gün içinde yaşlanacak. Aslında soru oldukça iyi cevaplar alıyor.
Robert Harvey

1
BTW, herhangi bir en iyi uygulama, artık değer üretmeyecek kadar uç noktalara götürülebilir.
Robert Harvey

Yanıtlar:


22

Kod Biçimlendirme

Don't     get    me   wrong             ,
code      should be   consistent        & 
readable                                , 
but       some   take it         too far.

Evet, eski değişken türlerinin ve değişken adlarının bir dizi değişken bildirimde kendi sütunlarına ihtiyacı vardır. Ah! =Başlatıcılar için ve dördüncü için ekstra satırı unuttunuz !
Kasım'da Macneil

[Lanet olsun, oy verdim, ama günlük sınıra ulaştım ...]
Macneil

3
Profesörlerimiz bizi dışarı atamaların kodunu bu şekilde biçimlendirmeye zorladı. Bu alışkanlıktan kurtulmam için yıllar aldı.
Oliver Weiler

Ah hayatım. Diğer cevaplarda gülüyordum, ama bu gerçekten acıtıyor :-(
Steve314

2
+1 Bir keresinde geliştiricinin kodunu doğru yapmayı reddettiği bir kütüphane ile çalıştım çünkü sütun biçimli kodunu
bozdu

20

Eskiden bir sürü montajcı yazardım. Sadece derleyiciler daha iyi değil, çoğu donanımın artık kodun sıra dışı yürütülmesine adanmış birçok mantığı var. Gerçek mikro sorun zamanlamadır, çoğu bilgisayar talimatı bir sonuç üretmek için birkaç makine saati alır - ve önbelleği kaçıran bir bellek yükü birkaç yüz sürebilir! Bu nedenle fikir, bir sonuç beklemek yerine yararlı bir şeyler yapmak için diğer talimatları planlamaktı. Ve modern makineler saat başına birkaç talimat verebilir. Bir kez sıra dışı uygulama HW almaya başladığımızda, el kodlaması ile mükemmel performans elde etmeye çalışmanın bir kupa oyunu haline geldiğini buldum. İlk olarak sipariş dışı HW, talimatları özenle hazırlanmış siparişinizde yerine getirmez, havalı yeni HW mimarisi, yetersiz yazılım programlamasının cezasını, derleyicinin genellikle performansınızın yüzde birkaçında olacağı kadar azaltmıştır. Ayrıca derleyiciler şimdi unrolling, alt yükleme, yazılım boru hattı vb gibi iyi bilinen ama karmaşıklık üreten hileler uyguladıklarını öğrendim. Hepsini kullanın ve ihtiyacınız olan montajcı sayısını birkaç kat artırın!

Muhtemelen daha da önemlisi, çoğu performans sorunu, talimat sorun oranları ile ilgili değil, verileri CPU'ya almakla ilgilidir. Yukarıda bahsettiğim gibi, bellek gecikmesi şimdi yüzlerce döngüdür ve CPU saat başına birkaç komut yürütebilir, bu nedenle program ve özellikle veri yapıları önbellek isabet oranı son derece yüksek olacak şekilde tasarlanmadıkça, talimatta mikro seviyesinin getirisi olmayacaktır. Tıpkı askeri tiplerin amatörlerin taktikleri, profesyoneller de lojistik konuşmasını söyledikleri gibi. Performans programlama artık% 90'dan fazla lojistik (hareketli veri). Modern bellek yönetimi tipik olarak birden çok önbellek seviyesine sahip olduğundan ve sanal bellek sayfaları TLB adı verilen bir donanım birimi tarafından işlendiğinden, bu rakamı belirlemek zordur. Ayrıca, gerçek veri aktarımları bayt biriminde olmadığından, adreslerin düşük düzeyli hizalanması önemli hale gelir, hatta 64bit uzun ömürlüdür, ancak önbellek birimleri halinde gelirler. Daha sonra, modern makinelerin çoğu, yakın gelecekte hangi önbellek hattını özleyebileceğinizi tahmin etmeye çalışan ve önbelleğe almak için otomatik ön getirmeler yayınlayan donanıma sahiptir. Gerçek şu ki, modern CPU'larda performans modelleri neredeyse anlaşılamayacak kadar karmaşıktır. Ayrıntılı donanım simülatörleri bile cipslerin tam mantığıyla asla eşleşemez, bu nedenle kesin ayarlama artık imkansızdır.

Bazı el kodlamaları için hala bir yer var. Daha önemli doğrusal cebir işlemleri (matris çarpımı gibi) gibi matematik kütüphaneleri (exp fonksiyonu gibi) hala donanım satıcısı (örn. Intel veya AMD veya IBM) için çalışan uzmanlar tarafından elle kodlanmaktadır, ancak muhtemelen sadece mega-bilgisayar corp başına birkaç üst çentik montajcı programcı gerekir.


1
El kodlama, CPU satıcıları dışında çalışan kişiler için zorlaşmaktadır, çünkü görev giderek içeriden öğrenilen bilgilere ve satıcıya özgü araçlara (derleyiciler ve profilleyiciler) bağlıdır. spiral.net , CPU optimizasyonunu modellemeye ve optimum çözümler aramayı otomatikleştirmeye çalışır.
rwong

Birçok bilgisayar dili, programcıları, sonuçları elde edilecek hesaplamalar için çift hassasiyetli bir acı haline getirerek anlamsız bir şekilde mikro optimizasyon yapmaya zorlar float. Bazı nedenlerden dolayı anlayamıyorum, birçok insan bunun iyi bir şey olduğunu düşünüyor.
supercat

11

Bazen bir değişken veya yöntem için iyi bir isim seçerken zaman harcıyorum (israf?).

Tüm çalışmaları (bir programı) aynı dilsel stile sokmaya çalıştığımda biraz daha ileri gidiyor. Bazen fikrim değişir ve kitabı revize ederim. :)

Hayır, bu kadar zaman alıyor. Oldukça nadirdir. Ama programlarımda iyi gramer tutmayı seviyorum.


3
Adlandırma zor. Bu nedenle, çok daha iyi bir isim düşündüğünüzde bir ismi tekrar gözden geçirmelisiniz. Bu zihin çabası yakalar ve umarım "neden" de kristalize unutmayın.

1
Bu çok sol beyinli bir şeydir (dili işlemekten beyninizin sol tarafı sorumludur). Sağ beyinli bir programcı olarak, anlambilim hakkında endişelenmek için daha az zaman harcamak ve tüm parçaların birbirine nasıl uyum sağlamak konusunda daha fazla zaman harcamak eğilimindeyim.
Jason Baker

7
Değişken ve yöntem adlandırma sürdürülebilirliğin önemli bir parçasıdır. Bir gerektiğini şu andan itibaren bu 5 yıl, böylece kod koruyarak kişi onunla daha kolay bir zamanı var adlarıyla ilgili zaman düşünme geçirmek.
GrandmasterB

@grandmaster: Daha fazla katılamadı.
Robert Harvey

4
@ sağ beyinçiler: Lütfen lef-tbrainers kodlayın, böylece kodunuzu da okuyabilirim
Juan Mendes

10

Zaman karmaşıklığı. Programın gerçekçi bir şekilde karşılaşacağını bildiğim her şeyden daha büyük bir büyüklükteki bir ölçekte en kötü durum performansı için işleri optimize etmek için çok fazla zaman harcıyorum.

Ben gitmesine izin sadece çok obsesif değilim 'ama olabilir diğer tasarım kararları gelen gerçekçi oluyor o engel bile, o büyük büyümek' kemik.

Ancak, savunmamda, gerçekçi olmayan gerçeklik olsaydı .. optimizasyon artık 'mikro' değil. Not, imkansız demedim ama gerçekçi değil .

Elbette gereksinimler önceliklidir.


1
Bu nedenle batmış bir şirkette çalıştım.
Henry

2
@Henry - Söz veriyorum, ben değildim :)
Tim Post

1
@Henry: Sen büyük olasılıkla asla olmaz şeyler için optimize zaman boşa, ya da demek değildi onlar kadar ... ihtimalle gerçekleşmesi "hiçbir zaman" olur şeyler düşünmek yaptım olur ve artık çok geçti?
Dean Harding

2
@Henry: Bir şirketin oldukça ölçeklenebilir bir ürünü varsa ve hala batıyorsa, satış ve pazarlamanın hatası (yüksek hacimli müşterileri hedeflememek ve uygun bir şekilde fiyatlandırmamak için), geliştirmenin değil.
rwong

2
Şirket, 1 kullanıcısı olmadığında milyonlarca kullanıcı için bir sistem tasarlamak için çok fazla zaman harcadı. Pazarlama hatası olmalı. Evet, pazarlamayı suçlayalım, o adamlar aptal.
Henry

8

Java istisna işleyicileriyle uğraşmak için haftalarca zaman harcadığımı düşünüyorum.

Bu, yılda iki veya üç kez başarısız olan kod için çok fazla iştir. Bu bir uyarı mı yoksa bilgi mi? Hata mı yoksa ölümcül mü? İşlem beş dakika içinde yeniden ortaya çıkacak mı ölümcül mü? Her şey hala varsayılan durumundaysa gerçekten bir uyarı mıdır?

Göbek bakan bir sürü ve bir IO hatasının doğası hakkında tartışma. Ağ üzerinden dosya okuyamıyorsanız, bu bir dosya hatası mı yoksa ağ hatası mı? Ve bunun gibi.

Bir noktada tüm concat dizelerini değiştirdim, String.formatböylece yıllık dosya hatası öbekte fazladan nesnelere neden olmaz. Bu bir israftı.


3
Bu önemli bir çalışma. Başarısızlığın fiyatı = günlük WTF'de bulunan hata mesajınız.
Steve314

7

Sanırım LOC'larla çok ilgiliyim. Çok fazla LOC değil, daha çok sayıda ifade ve hatta daha fazla sayıda yinelenen ifade. Yinelenen kodlara alerjim var. Genel olarak yeniden düzenleme seviyorum, ama ne yaptığımın yaklaşık% 50 kod önemli ölçüde güzel yapmıyoruz varsayalım.


4
+1 "Yinelenen koda alerjim var". Ayrıca buradaki
yanıtıma

Düşünüyorum - Knuth'un goto hakkında yaptığı bir noktaya ilişkin döngülerle bu sorunu yaşıyorum ve bazen yapılandırılmış kod yazmak için bir veya iki veya birkaç yinelenen kod ticareti yapmak zorunda kalıyorum. Ben edecek çok nadir durumlarda goto (en yaygın = oluşturulan kodu) kullanın, ancak bu bozukluğun Varyasyon süresini endişesi ve bir döngü sonsuz önemsiz bir verimsizlik ortadan kaldırmak henüz kod Okunabilir tutmaya çalışıyorum kurcalıyor israf edilmektedir.
Steve314

5

Tüm satırı bir dizeye okumak yerine bir satır satır okumak ve dizeyi tek seferde işlemek.

Elbette, yürütme hızında bir fark yaratır, ancak nadiren ekstra kod satırlarına değer. Kodu daha az bakım yapılabilir hale getirir ve kod boyutunu artırır.

Evet, dosya 3GB büyükse bu muhtemelen anlamsızdır, ancak dosyaların çoğu o kadar büyük değildir (en azından ;-) ile çalıştığım olanlar değil).


3
3 GB veya daha fazla olsa bile, 64 bit makine bunu sanal bellekle işleyebilir. Bellek eşlemeli bir dosya kullanın ve gerekinceye kadar dosyanızın herhangi bir bölümünü bile okumaz. Dikkat edin, bu normal durumda bile mikro optimizasyon.
Steve314

3

Montaj dilini yazarken baytlar ve döngüler üzerinde nitpick yapmak mantıklıydı, ama bu uzun zaman önceydi ve derleyiciler o zamandan beri çok yol kat etti. Şimdi manuel olarak optimize etmek denemek olmaz.

Benzer şekilde, C'de yazmaya geçtiğimde, C derleyicilerinden daha iyi bir iş yapmak oldukça kolaydı, ancak her yıl Borland veya Microsoft veya birileri, bir öncekini odanın etrafında tekmeleyen yeni geliştirilmiş bir tane yayınlayacaktı. Derleyicinin yaydığı gerçek montaj koduna dikkat etmeye başladım ve güzel ve sıkı bir kod yazmıyorsa, döngülerin açılması, değişkenlerin döngülerin dışına taşınması vb.

Şimdi Perl, Python ve Ruby gibi çok daha yüksek dillerde yazıyorum. Derleyici hilelerinden bazılarını kullanıyorum, eğer mantıklıysa döngü açma, döngüsel değişkenleri döngülerin dışına taşıma, vb.Ama neredeyse endişelenmiyorum çünkü CPU'lar artık daha hızlı bir weeeeee biraz daha hızlı. Bir uygulama beklenmedik bir şekilde sürükleniyor gibi görünüyorsa, bir profiler kullanacağım ve ne bulabileceğimi göreceğim ve sonra bir şey geliştirilebilirse, bir şeyi daha hızlı yapmayı düşündüğüm çeşitli yollarla karşılaştırmaya başlayacağım ve ölçeklendirir.

Genel olarak yılların tecrübesine dayanarak nasıl kod yazacağım konusunda akıllı olmaya çalışıyorum.


Merhaba Greg, cevap için teşekkürler, ama programcıların zaman harcamak için ne yaptığını arıyorum , çalışma zamanı performansını optimize etmek için değil. Yukarıda iki harika örnek vardır: Değişken isimleri ve küçük kod çoğaltmasının bile kaldırılması.
Macneil

3

Mikro optimizasyon: paralelleştirilebilen veya yeni donanımla iyileştirilebilen şeylerin tek iş parçacıklı performansını iyileştirme.

Bir bilgisayarda 10 yıl önce bir şey yavaşsa, daha ucuz bir çözüm muhtemelen programcı zaman optimizasyonunu boşa harcamak yerine daha yeni ve daha hızlı bir bilgisayar satın almaktır. Bununla birlikte, dikkate alınan optimizasyonların büyük bir odağı, bugün elde edebileceğiniz 8 çekirdeği veya ekstra çöp maliyeti gibi minutia hakkında acı vermek yerine birkaç yıl içinde alabileceğiniz 64'ü kullanmanın bir yolunu bulmak olmalıdır. Toplamak.


2

Çalışma zamanı performansı açısından mikro optimizasyon bugün bile kapalı bir sorundur (daha az yaygın olsa da). Bazen insanlara, her bir istek için fazladan bir nesne tahsis etmenin veya fazladan bir işlev çağrısı eklemenin ek yükünün ihmal edilebilir olduğunu açıklamak zorundayım.

Bunun yanı sıra, programcıların basitlik (kendim dahil) için mikro-optimize ettiğini görüyorum. Basitlik ve basitlik arasındaki farkı açıklamak zorunda olmadığım bir yerde henüz çalışmadım.


Neden programcılar. farklı olmak? Fark nedir, lütfen.
Dan Rosenstark

@Yar - Programcılar neden neyden farklı olabilir?
Jason Baker

neden olur programmers.= programmers.stackexchange.comEğer bu iki kavram arasındaki farkı açıklamak zorunda kalmıştım sen çalıştık her yerden farklı olsun? Lütfen farkı açıklayın.
Dan Rosenstark

@Yar - Bunun olacağını bilmiyorum. Aslında, programcılar.se noktası programcıların bilgi havuzuna yardımcı olmak olduğu için, insanların en azından benim cevabım tarafından biraz aydınlanmış olabileceğini ummuyorum.
Jason Baker

2
Peki b / t basitliği ve basitliği arasındaki fark nedir?
Dan Rosenstark

2

Ben gerçekten gerekli olmadığı sürece optimizasyon yapmama prensibindeyim. Ve ben de profilin ilk prensibi içindeyim. Prensip olarak, sadece gerekli bir farkı yaratacak bir şeyi optimize edeceğim.

Prensipte bu. Ancak prensip bir yalancıdır.

İç döngülerde çok kullanılacağını düşündüğüm, sık kullanılan kütüphanelerdeki işlevlere dikkat etme alışkanlığım var. Ve sonra, başka bir işlevdeki bir şeyi tespit ettiğinizde, bu çok sık kullanılmaz ...

Oh - ve sonra "yazıyorum - elbette önemli bir kütüphane" mantığı var.

Oh - ve BTW. Bir optimizasyonu yönlendirmek için henüz bir profil oluşturucu kullanmadım. Ticari olana erişmeyin ve asla gprof'u anlamaya yönelik motivasyonu pek geliştirmediniz.

Temel olarak, ben bir ikiyüzlüyüm. Bu ilkeler diğer insanlar için de geçerlidir, ancak birisinin "neden bu kadar yavaş ve berbat bir şekilde yazdınız?" bu yüzden onları kendime asla düzgün bir şekilde uygulayamam.

Yine de burada yaptığım kadar kötü değilim. Ve ben kendini aldatmaya karşı tamamen bağışıkım, bu yüzden bu konuda haklı olduğumu biliyorsun!

DÜZENLE

Eklemeliyim - en büyük aptal asıltılarımdan biri de genel gider çağrıları. Elbette her yerde değil, ama sanırım bu döngülerin içinde çokça kullanılacağını düşünüyorum (bir sorun hakkında nesnel bir kanıtım olmadığında). Sanal yöntem çağrıları birden fazla yapmaktan kaçınmak için kötü offsetof tabanlı kod yazdım. Sonuç, daha da yavaş olabilir, çünkü muhtemelen optimizerlerin iyi başa çıkmak için tasarlandığı bir kodlama stili değildir - ama daha akıllıdır ;-)


+1 Ah, evet! Bu sınıf, uygulamamın son derece spesifik ve ilginç komut satırı argümanlarını ayrıştırıyor, ancak Javadoc olduğunda biçimlendirip tam olarak belgelendirmeme izin verin, çünkü diğerleri bunu yıllarca kullanacak! [Daha sonra oy kullanmam gerekecek, günlük sınırım ulaştı.]
Macneil

@Macneil - bu Doxygen, bunu öğreneceğim. Açık bulabildiğim her seçenekle, her küçük işlev, bir düzine hoş GraphViz grafiği ile tamamlanan heyecan verici ayrıntılarla "belgelenir". Gerçekten herkes benim kodumun ne kadar önemli olduğunu takdir yardımcı olur - ve çıktı oldukça büyük bir ofis bloğu duvar kağıdı olabilir.
Steve314

1

Bilgisayarların saat sürelerinin mikrosaniye cinsinden, hafızanın kilobayt cinsinden ve ilkel derleyicilerin ölçüldüğü eski günlerde, mikro optimizasyon bir anlam ifade ediyordu.

Mevcut nesil bilgisayarların hızı ve boyutu ve mevcut nesil derleyicilerin kalitesi, mikro optimizasyonun genellikle toplam zaman kaybı olduğu anlamına gelir. İstisnalar , bazı hesaplama yoğun kodlarından kesinlikle maksimum performans elde etmeniz gerektiğinde ya da son derece sınırlı kaynaklara sahip gömülü bir sistem için yazarken ortaya çıkma eğilimindedir .

ancak programcıların çalışma zamanı performansını optimize etmek için zaman kaybetmek için ne yaptığını arıyorum.

Twitter ve Facebook akla geliyor :-)


Merhaba Stephen, bu mikro-optimizasyon hakkında harika bir yorum, ama günümüzdeki eşdeğerlerini görüyor musunuz? [Facebook ve Twitter çok uzaklara taşınabilecek “en iyi uygulamalar” değil.]
Macneil

Hala mantıklı. Saat zamanları daha küçük büyüklük sıraları olabilir, ama kod daha büyük büyüklük sıraları ...
hplbsh

@Stuart - bu, mikro optimizasyon için daha fazla kod büyüklüğünün olduğu anlamına gelir ...
Stephen C
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.