Bir yazılımı daha iyi performans için, geliştirmenin başında veya sonunda optimize etmek ne zaman daha iyidir?


19

Ben küçük bir yazılım geliştiricisiyim ve bir yazılımı daha iyi performans (hız) için optimize etmek için en iyi zamanın ne olacağını merak ediyordum.

Yazılımın yönetilmesi son derece büyük ve karmaşık olmadığı varsayılarak, en iyi duruma getirmek için daha fazla zaman harcamak daha mı iyidir yoksa sadece tüm işlevleri doğru şekilde yürüten yazılımı geliştirmeli ve daha sonra daha iyi performans için optimize etmeye devam etmeli miyim?


7
Düşünce deneyi: İnteraktif oyununuzu geliştirmek için yorumlanmış bir programlama dili seçersiniz ve seçtiğiniz dilin kare hızı gereksiniminizi karşılamak için gerekli hıza sahip olmadığı geliştirme sürecinin yarısını keşfedersiniz. Royally vidalı mısın?
Robert Harvey

8
Başka bir düşünce deneyi: Oyununuzda performans için kritik olduğuna inandığınız bazı kodları dikkatlice optimize edersiniz, ancak kod üzerinde bir profil oluşturursunuz ve optimize ettiğiniz kodun genel performansa önemli ölçüde katkıda bulunmadığını keşfedersiniz ve Kodun netliğini azalttı. Zamanını harcadın mı
Robert Harvey

8
Sonuç: Bu bir / veya karar mıdır, yoksa bazı performans kararlarını erkenden ertelemek ve diğerlerini ertelemek önemli olabilir mi?
Robert Harvey

1
Bir cevap yazıyordum ve sildim ve tekrar yazıyordum. Bu sorunun sadece 1 cevabı yok çünkü duruma göre değişiyor. Bazı durumlarda bir ürünü acele etmek diğer tüm hususları ortadan kaldırır, bazı durumlarda başlangıçtan itibaren optimizasyon zor bir gereksinimdir ve optimizasyonun, başlangıçtan itibaren optimize edilmesinin veya optimize edilmemesinin veya hiç optimize etmemenin geçerli olduğu bir milyon senaryo ve Herneyse.
Pieter B

Nasıl bakarsanız bakın. Başlangıçta optimize edilecek bir şey yok çünkü karşılaştırılacak bir şey yok. Bir şeyi optimize etmek için hala 2 referansa ihtiyacınız var: ideal performans (gereksinimlere göre) ve gerçek olan (bir şey çalıştırdıktan sonra aldığınız).
LAIV

Yanıtlar:


52

Bir numaralı şey her zaman ve sonsuza kadar okunabilirlik olmalıdır. Yavaş ama okunabilirse, düzeltebilirim. Kırılmış ama okunabilirse, düzeltebilirim. Okunamazsa, başkasına bunun ne yapması gerektiğini sormalıyım.

Yalnızca okunabilir olmaya odaklandığınızda kodunuzun nasıl performans gösterebileceği dikkat çekicidir. O kadar ki, genellikle bir bakım nedeni verilene kadar performansı görmezden gelirim. Hızı umursamadığım anlamına gelmemeli. Yaparım. Okumayı zorlaştırdıklarında çözümleri daha hızlı olan çok az sorun olduğunu gördüm.

Beni bu moddan sadece iki şey çıkarıyor:

  1. Tam bir büyük O iyileştirme şansı gördüğümde , o zaman bile sadece n herkesin umursayacağı kadar büyük olduğunda.
  2. Gerçek performans sorunları gösteren testlerim olduğunda. Onlarca yıllık deneyimle bile, testlere hala matematikten daha fazla güveniyorum. Ve matematikte iyiyim.

Her durumda, bir çözüm denememeniz gerektiğini düşünerek analiz felçinden kaçının çünkü en hızlı olmayabilir. Kodunuz aslında birden fazla çözüm denerseniz faydalı olacaktır çünkü değişiklikleri yapmak sizi değiştirmeyi kolaylaştıran bir tasarım kullanmaya zorlayacaktır. Esnek bir kod tabanı daha sonra gerçekten ihtiyaç duyduğu yerde daha hızlı hale getirilebilir. Esnek aşırı hız seçin ve ihtiyacınız olan hızı seçebilirsiniz.


Yazılım geliştiricilerin odaklanması gereken bir numaralı şeyin olabildiğince hızlı bir şekilde raflarda bir ürün elde etmek olduğunu fark ettim, hatalar ve kötü tasarım daha sonra düzeltilebilir.
Pieter B

12
@PieterB: "hatalar ve kötü tasarım daha sonra düzeltilebilir" gibi bir strateji ile gelişimi yavaşlatmak oldukça kolaydır . Kötü tasarımla, okunamayan, kıvrımlı kodun yanı sıra aşırı mühendislik kodu gibi şeyleri kastediyorum.
Doc Brown

5
@Walfrat: Bence örneğiniz okunabilirlikten ödün vermeden kolayca hızlandırılabilir ve bu cevabı "okunabilir kodun herhangi bir performans problemi yok" olarak değil, daha çok "perfomance problemleri kod yaparak otomatik olarak önlenmeyecek" şeklinde yorumluyorum okunamaz".
Doc Brown

2
@PieterB: ya da aldıkları ürün o kadar kullanışsız olduğu için parasını geri almak isteyen bir müşteriniz var.
Doc Brown

2
@svidgen okunamayan kodun testler olmadan hızını değerlendirmek imkansız. Hıza odaklanmak ve okunabilirliği görmezden gelmek, fark edilemez hız sorunları yaratır. Okunabilirliğe odaklanmak, hız sorunlarını o kadar belirgin hale getirir ki, bunu düşünmenize gerek kalmaz. Yazdığınız anda göreceksiniz. Yapmasanız bile, en azından test ettikten sonra sorunu bulabileceksiniz. Tüm bunlar göz önüne alındığında, anyonların varsayılan odak noktası neden okunabilirlik hızına odaklanmalıdır? Hıza odaklanmak ve okunabilirliği görmezden gelmek size hiçbirini vermez.
candied_orange

27

Belirli bir performans seviyesi gerekliyse (işlevsel olmayan bir gereklilik), bu başlangıçtan itibaren bir tasarım hedefi olmalıdır. Örneğin, bu hangi teknolojilerin uygun olabileceğini veya programdaki veri akışını nasıl yapılandıracağınızı etkileyebilir.

Ancak genel olarak, kod yazılmadan önce optimizasyon yapmak mümkün değildir: önce kodun çalışmasını sağlayın, sonra doğru yapın ve son olarak hızlı olun .

Çoğu işlevselliği uygulamadan önce optimizasyonla ilgili büyük bir sorun, kendinizi yanlış yerlerde alt optimal tasarım kararlarına kilitlemiş olmanızdır. Sürdürülebilirlik ve performans arasında çoğu zaman (ancak zorunlu olarak) bir tutarsızlık vardır. Programınızın çoğu bölümü performans açısından tamamen önemsizdir! Tipik programlar, gerçekten optimize etmeye değer birkaç sıcak noktaya sahiptir. Bu nedenle, performansa ihtiyaç duymayan tüm yerlerde performansın sürdürülebilirliğini feda etmek gerçekten kötü bir ticarettir.

Sürdürülebilirlik için optimizasyon daha iyi bir yaklaşımdır. Akıllılığınızı sürdürülebilirlik ve net tasarımlara harcarsanız , uzun vadede kritik bölümleri tanımlamayı ve genel tasarımdan ödün vermeden bunları güvenli bir şekilde optimize etmeyi daha kolay bulacaksınız.


15

daha iyi performans (hız) için bir yazılımı optimize etmek için en uygun zaman.

Performansın hız ile aynı olduğu fikrini zihninizden kaldırarak başlayın. Performans, kullanıcının performans olduğuna inandığı şeydir .

Bir uygulamanın bir fare tıklamasına iki kat daha hızlı yanıt vermesini ve on mikrosaniyeden beş mikrosaniyeye geçmesini sağlarsanız, kullanıcı umursamaz. Bir uygulamanın bir fare tıklamasına iki kat daha hızlı yanıt vermesini ve dört bin yıldan iki bin yıla geçmesini sağlarsanız, kullanıcı umursamaz.

Uygulamanızı iki kat daha hızlı yaparsanız ve makinedeki tüm belleği kullanır ve çökerseniz, kullanıcı artık iki kat daha hızlı olmasını umursamaz.

Performans, belirli bir kullanıcı deneyimine ulaşmak için kaynak tüketimi hakkında etkili ödünleşmeler yapma bilimidir. Kullanıcının zamanı önemli bir kaynaktır , ancak asla sadece "daha hızlı" değildir. Performans hedeflerine ulaşmak neredeyse her zaman ödünleşim gerektirir ve genellikle yer için zaman ayırır veya tam tersi olur.

Yazılımın yönetilmesi son derece büyük ve karmaşık olmadığını varsayarsak

Bu korkunç bir varsayım.

Yazılım yönetmek için büyük ve karmaşık değilse, muhtemelen bir kullanıcının önem verdiği ilginç bir sorunu çözmez ve muhtemelen optimize edilmesi çok kolaydır.

başlangıçta daha fazla zaman harcamak daha mı iyidir yoksa tüm işlevselliği doğru şekilde yürüten yazılımı geliştirmeli ve daha iyi performans için optimize etmeye devam etmeli miyim?

Orada boş bir sayfada oturuyorsunuz ve yazıyorsunuz void main() {}Optimizasyona başlıyor musunuz? Optimize edilecek hiçbir şey yok! Doğru sipariş:

  • Derlemesini sağlayın
  • Doğru yap
  • Zarif yap
  • Hızlı yap

Başka bir sırayla yapmaya çalışırsanız, karışıklık olan yanlış kodla karşılaşırsınız ve şimdi yanlış cevapları gerçekten hızlı bir şekilde üreten ve değişikliklere direnen bir programınız var.

Ama orada eksik bir adım var. Gerçek DOĞRU YOL

  • Müşterilerin ve yönetim ile birlikte çalışarak gerçekçi, ölçülebilir performans metrikleri ve hedefleri belirleyin, müşterilerin hızın önem verdiği tek metrik olmadığını unutmayın.
  • Projenin mevcut durumunu hedeflerinize göre takip edebilen bir test takımı kullanın
  • Derlemesini sağlayın
  • Testleri yapın. Artık hedefinize ulaşmıyorsanız, erken kötü bir yol izlediğinizi fark edin. Bilimi kullanın . Düzeltilebilecek kötü bir algoritma mı tanıttınız, yoksa temelde yanlış olan bir şey mi var? Temelde yanlışsa, baştan başlayın. Düzeltilebilirse, bir hata girin ve daha sonra tekrar gelin.
  • Doğru yap
  • Testleri tekrarlayın ...
  • Zarif yap
  • Testleri tekrarlayın ...
  • Hedefinize uygun musunuz? Evet ise, plaja gidin . Değilse, yeterince hızlı yapın .

"Performans, kullanıcının performans olduğuna inandığı şeydir." - Gerçekten de bazen kullanıcı deneyimi aslında daha iyi şeyler biz zaman ayırın beklediğiniz yapmak almak zamanı: webdesignerdepot.com/2017/09/when-slower-ux-is-better-ux
svidgen

belki "bilimsel kullanımı" yerine "bilimsel olun" :)
mavi

@svidgen: Bir kez ilerleme çubuğunu yavaşlatmak için kodumu değiştirdiğimi hatırlıyorum. Kullanıcılar bazı gerçek işlerin yapıldığı izlenimine kapıldılar ve bundan memnun oldular. Hesaplanan işlev yararlıydı, ancak sonuç saniyenin onda birinden sonra orada olsaydı program hiçbir şey yapmıyordu.
Giorgio

2
@Giorgio: Bu benimle çıkıyor, ama bir sabit diski ilk aldığımda hatırlıyorum ve bir oyunu veya belgeyi kaydedip bir şeylerin yanlış gittiğini düşünüyorum çünkü operasyon diskete kaydetmeye kıyasla algılanabilir bir zaman almadı. Ve elbette şimdi oyun durumu ve belgeler o kadar büyük ki zaman kazanmaya geri döndük.
Eric Lippert

3

Genel bir kural olarak, daha sonra performans için optimize etmek en iyisidir, ancak geliştiricilerin herhangi bir önemli yük veya veri eklendiğinde yavaşlayacak bir yazılımla sonuçlandıklarını fark ettiklerinde birçok projenin kötüleştiğini gördüm.

Yani, orta yol yaklaşımı bence en iyisi olacaktır; çok fazla vurgu yapmayın, ancak performansı tamamen göz ardı etmeyin.

Birçok kez gördüğüm bir örnek vereceğim; bir ORM kütüphanesi verildiğinde, bir veya daha fazla Sipariş alabilen bir Kullanıcı varlığımız var. Bir Kullanıcı için tüm Siparişleri döngüye sokalım ve Kullanıcının mağazamızda ne kadar harcadığını öğrenelim - saf bir yaklaşım:

User user = getUser();
int totalAmount;
for (Order o : user.getOrders()) {
  totalAmount += o.getTotalAmount();
} 

Geliştiricilerin sonuçları düşünmeden benzer şeyler yazdığını gördüm; İlk olarak, kullanıcı tablosunda sadece bir SQL sorgusu olacak olan (ancak çok, çok daha fazlasını içerebilecek) kullanıcıyı alıyoruz, daha sonra siparişteki tüm sipariş satırları için tüm ilgili verileri almayı içeren siparişler arasında dolaşıyoruz , ürün bilgileri, vb - tüm bunlar sadece her sipariş için tek bir tamsayı almak için!

Burada SQL sorgularının miktarı sizi şaşırtabilir. Elbette, varlıklarınızın nasıl yapılandırıldığına bağlıdır.

Burada, doğru yaklaşım büyük olasılıkla ORM tarafından sağlanan sorgu dilinde yazılmış ayrı bir sorgu aracılığıyla veritabanından toplamı almak için ayrı bir işlev eklemek olacaktır ve ben bunu ilk kez yapmak ve bunu erteleme değil savunmak sonrası için; çünkü bunu yaparsanız, muhtemelen ilgilenmeniz gereken çok daha fazla sorunla karşılaşırsınız ve nereden başlayacağınızdan emin olmazsınız.


3

Toplam sistem performansı, sistem bileşenlerinin bütünlüğünün karmaşık etkileşimlerinin bir ürünüdür. Doğrusal olmayan bir sistem. Bu nedenle performans, yalnızca bileşenlerin bireysel performansıyla değil, aralarındaki darboğazlarla da açıklanır .

Açıkçası, sisteminizin tüm bileşenleri henüz oluşturulmamışsa darboğazları test edemezsiniz, bu yüzden gerçekten çok erken test edemezsiniz. Öte yandan, sistem kurulduktan sonra, istediğiniz performansı elde etmek için yapmanız gereken değişiklikleri yapmayı o kadar kolay bulamayabilirsiniz. Bu bir kemik ateşi Catch-22 .

Konuları daha da zorlaştırmak için, genellikle erken bulunmayan, üretime benzer bir ortama geçtiğinizde performans profiliniz büyük ölçüde değişebilir.

Ee ne yapıyorsun? Birkaç şey.

  1. Pragmatik olun. Daha önce performans için "en iyi uygulama" olan platform özelliklerini kullanmayı tercih edebilirsiniz; örneğin, farklı işçilerin paylaşılan verilere erişim için uğraştığı çok iş parçacıklı bir uygulamanın ölümü olabilecek bağlantı havuzu oluşturma, eşzamansız işlemleri kullanma ve durum bilgisinden kaçınma. Normalde bu modelleri performans için test etmezsiniz, neyin iyi çalıştığını deneyimlemeniz yeterlidir.

  2. Yinelemeli olun. Sistem nispeten yeni olduğunda temel performans önlemlerini alın ve yeni eklenen kodun performansı çok fazla düşürmediğinden emin olmak için zaman zaman yeniden test edin.

  3. Erken optimize etmeyin. Neyin önemli olacağını ve neyin önemli olmayacağını asla bilemezsiniz; Örneğin, programınız sürekli olarak G / Ç'de bekliyorsa, süper hızlı bir dize ayrıştırma algoritması yardımcı olmayabilir.

  4. Özellikle web uygulamalarında performansa değil, ölçeklenebilirliğe çok fazla odaklanabilirsiniz. Uygulama ölçeklenebilirse, performans neredeyse önemli değildir, çünkü yeterince hızlı oluncaya kadar çiftliğinize düğüm eklemeye devam edebilirsiniz.

  5. Veritabanına özel dikkat gösterilmektedir. İşlem bütünlüğü kısıtlamaları nedeniyle, veritabanı sistemin her yerine hakim olan bir darboğaz olma eğilimindedir. Yüksek performanslı bir sisteme ihtiyacınız varsa, veritabanı tarafında çalışan, sorgu planlarını inceleyen ve ortak işlemleri mümkün olduğunca verimli hale getirecek tablo ve dizin yapıları geliştiren yetenekli kişilere sahip olduğunuzdan emin olun.

Bu faaliyetlerin çoğu projenin başlangıcı veya bitişi için değildir, ancak sürekli olarak gerçekleştirilmelidir .


1

Ben küçük bir yazılım geliştiricisiyim ve bir yazılımı daha iyi performans (hız) için optimize etmek için en iyi zamanın ne olacağını merak ediyordum.

Çok farklı 2 uç olduğunu anlayın.

İlk uç, tasarımın büyük bir bölümünü etkileyen, işin kaç işlem ve / veya iş parçasına bölüneceği ve parçaların nasıl iletişim kurduğu (TCP / IP yuvaları? Doğrudan işlev çağrıları?) Gibi gelişmiş bir JIT'in uygulanması gibi şeylerdir. veya "her seferinde bir opcode" yorumlayıcı veya veri yapılarının SIMD için uygun olup olmayacağını planlamak veya ... Bunlar, uygulama üzerinde güçlü bir etkiye sahip olma ve sonradan takılması aşırı zor / pahalı hale gelme eğilimindedir.

Diğer uç mikro optimizasyonlar - her yerde küçük küçük ayarlamalar. Bunlar, uygulama üzerinde neredeyse hiçbir etkiye sahip değildir (ve genellikle en iyi şekilde bir derleyici tarafından yapılır) ve bu optimizasyonları istediğiniz zaman yapmak önemsizdir.

Bu uçlar arasında devasa bir gri alan var.

Gerçekte ortaya çıkan şey, "faydalar maliyetleri haklı çıkarıyor" sorusunu yanıtlamak için kullanılan deneyim / eğitimli tahminlerdir. Sık sık yanlış tahmin ederseniz, bir uçta / yakınında yapılan optimizasyonlar için, tüm çalışmalarınızı atmak ve sıfırdan veya proje arızasından yeniden başlamak (gereksiz derecede aşırı karmaşık bir tasarıma çok fazla zaman harcamak) anlamına gelir. Diğer uçta / yakınında, ölçümle (örn. Profil oluşturma) önemli olduğunu kanıtlayana kadar bırakmak çok daha mantıklıdır.

Ne yazık ki, çok fazla insanın optimizasyonun yalnızca "önemsiz" uç noktalarda (çoğunlukla alakasız) şeyleri içerdiğini düşündüğü bir dünyada yaşıyoruz.


1

Ne porforman ne de bakımı kolay kod yazmak en kolay yoldur. Porformant kodu yazmak daha zordur. Korunabilir kod yazmak henüz daha zor. Ve hem sürdürülebilir hem de performans gösteren kod yazmak en zor olanıdır.

Ancak, sürdürülebilir kod performansını artırmak, performans kodunu sürdürülebilir kılmaktan daha kolaydır.

Şimdi, açıkçası, yaptığınız sistemin türüne bağlı, bazı sistemler ağır performans açısından kritik olacak ve başlangıçta planlananlara ihtiyaç duyacak. Eric Lippert gibi yukarıda cevaplamış olan son derece yetenekli insanlar için bu sistemler yaygın olabilir; ama çoğumuz için inşa ettiğimiz sistemlerin azınlığıyız.

Bununla birlikte, modern donanımın durumu göz önüne alındığında, sistemlerin çoğunda , en başından itibaren optimizasyona özellikle dikkat etmek gerekli değildir, aksine performans yıkımından kaçınmak genellikle yeterlidir. Bununla ne demek istediğim, sadece sorgulama yerine bir sayım elde etmek için bir tablonun tüm kayıtlarını geri getirmek gibi açıkça aptalca bir şey yapmaktan kaçının select count(*) from table. Sadece hata yapmaktan kaçının ve kullandığınız araçları anlamak için çaba gösterin.

Ardından, öncelikle kodunuzun bakımını sağlamaya odaklanın. Bu demektir ki:

  1. Endişeleri olabildiğince kesin olarak ayırın (örneğin, veri erişimini iş mantığı ile karıştırmayın)
  2. Mümkün olduğunda somut türler yerine özet türlere referans
  3. Kodunuzu test edilebilir yapın

İstatistiklerin gerekli olduğunu gösterdiğinde sürdürülebilir kodun optimize edilmesi çok daha kolaydır.

Ardından, kodunuzun çok sayıda otomatik teste sahip olduğundan emin olun , bunun birkaç avantajı vardır. Daha az hata, gerektiğinde optimize etmek için daha fazla zaman anlamına gelir . Ayrıca, optimizasyon yaptığınızda, uygulamalarınızdaki hataları çok daha hızlı bulduğunuz için en hızlı çözümü tekrarlayabilir ve bulabilirsiniz.

Otomatik dağıtım komut dosyaları ve komut dosyası altyapısı da performans ayarı için çok kullanışlıdır, yine daha hızlı yinelemenize izin verir; diğer faydalarından bahsetmiyorum bile.

Bu nedenle, her zaman olduğu gibi (daha iyi tanımlamak için deneyime ihtiyacınız olacak) istisnalar vardır, ancak genel olarak tavsiyem: İlk olarak, araçlarınızı öğrenin ve performans darboğazlarını kodlamaktan kaçının. İkinci olarak, kodunuzun korunabilir olduğundan emin olun. Üçüncüsü, otomatik testler. Dördüncü, tam otomatik dağıtımlar. Sadece bu şeyler yapıldıktan sonra, optimizasyon konusunda endişelenmelisiniz.


1

Görüntü işleme ve ışın izleme gibi performans açısından kritik alanlarda çalışmakla taraflı olabilirim, ancak yine de "olabildiğince geç" optimize etmeyi söyleyebilirim . Gereksinimleriniz ne kadar kritik olursa olsun, ölçtükten sonra, peşinden her zaman çok daha fazla bilgi ve netlik vardır, bu da en etkili optimizasyonların bile daha sonra bu tür bilgileri edindikten sonra uygulanacağı anlamına gelir.

Tuhaf Durumlar

Ancak bazenbazı tuhaf durumlarda "olabildiğince geç" hala oldukça lanettir. Örneğin, çevrimdışı oluşturuculardan bahsediyorsak, performans elde etmek için kullandığınız veri yapıları ve teknikleri aslında kullanıcı sonu tasarımına sızıyor. Bu iğrenç gelebilir, ancak alan o kadar ileri derecede ve performans açısından kritiktir ki, kullanıcılar belirli bir raytracer için geçerli olan optimizasyon tekniklerine özgü (örn: ışınım önbellekleme veya foton eşleme) kullanıcı sonu kontrolleri kabul eder. bir görüntünün oluşturulması için saatlerce beklemek, diğerleri ise render işlemine adanmış makinelerle bir render çiftliği kiralamak veya sahip olmak için muazzam miktarda para yatırmak için kullanılır. Rekabetçi bir çevrimdışı oluşturucu, harcanan sürede önemsiz bir azalma sunabilirse, bu kullanıcılar için zaman ve parada büyük bir azalma vardır. Bu, zamandaki% 5'lik bir azalmanın kullanıcıları gerçekten heyecanlandırdığı bir tür alandır.

Bu tür tuhaf durumlarda, sadece bir render tekniğini willy-nilly seçemezsiniz ve daha sonra optimize etmeyi umamazsınız, çünkü kullanıcı sonu tasarımı da dahil olmak üzere tüm tasarım, kullandığınız veri yapıları ve algoritmalar etrafında döner. Burada, birey olarak ve belirli güçlü ve zayıf yönlerinizden, rekabetçi bir çözüm sunmada büyük bir etken olarak, diğer insanlar için iyi sonuç veren şeylerle bile gidemezsiniz. Arnold'un arkasındaki ana geliştiricinin zihniyeti ve duyarlılıkları, çok farklı bir yaklaşım kullanan VRay üzerinde çalışanlardan farklıdır; yerleri / teknikleri mutlaka değiştiremez ve en iyi işi yapamazlar (her ikisi de endüstriyel lider olsalar bile). Bir çeşit deneme ve prototip ve kıyaslama yapmak zorundasınız ve Eğer gerçekten satacak rekabetçi bir şey gemi umut orada son teknoloji teknikleri sonsuz dizi verilen yaparken özellikle iyi. Dolayısıyla bu tuhaf durumda, performans endişeleri, kalkınmaya başlamadan önce belki de en önemli endişe olarak öne çıkmaktadır.

Yine de bu, "mümkün olduğunca geç" optimizasyonunun bir ihlali olmak zorunda değildir , bu "mümkün olduğunca geç" , bu aşırı ve tuhaf durumlarda oldukça erken. Bu tür erken performans endişelerinin ne zaman ve neye ihtiyaç duymadığını bulmak, hiç değilse, muhtemelen geliştiricinin ana sorunudur. Optimize etmeyecek şey, bir geliştiricinin kariyerinde öğrenmeye ve öğrenmeye devam etmenin en değerli şeylerinden biri olabilir, çünkü her şeyi optimize etmek isteyen saf geliştiriciler sıkıntısı bulamazsınız (ve ne yazık ki işlerini bir şekilde sürdürmeyi başaran bazı gaziler bile) karşı üretkenliklerine rağmen).

Olabildiğince geç

Belki de en zor kısmı ne anlama geldiğini anlamaya çalışmaktır. Hala öğreniyorum ve neredeyse otuz yıldır programlıyorum. Ama özellikle üçüncü on yılda, bunun o kadar zor olmadığını anlamaya başlıyorum. Uygulamadan ziyade tasarıma odaklanırsanız, bu roket bilimi değildir. Tasarımlarınız daha sonra tasarımda değişiklik yapmadan uygun optimizasyonlar için nefes alan bırakırsa, daha sonra optimize edebilirsiniz. Ve gittikçe daha fazla üretkenlik, bu nefes alma odasını sağlayan bu tür tasarımları araştırmaya başladım.

Daha Sonra Optimize Etmek İçin Solunum Odası Sunan Tasarım

Bu tür tasarımların birçoğu "sağduyu" uygulayabilirsek, çoğu durumda başarılması o kadar da zor değildir. Kişisel bir hikaye olarak görsel sanatlara bir hobi olarak giriyorum (sanatçıların ihtiyaçlarını anlamak ve dillerini konuşmak için biraz kendim olmak için yazılım programlamaya yardımcı olduğunu düşünüyorum) ve 2000'lerin başında Oekaki uygulamalarını kullanarak biraz zaman geçirdim çalışmalarını doodle ve paylaşmak ve diğer sanatçılarla bağlantı kurmak için hızlı bir yol olarak çevrimiçi.

Özellikle benim en sevdiğim site ve uygulama performans kusurları ile bilmece (önemsiz herhangi bir fırça boyutu bir tarama yavaş olurdu), ama çok güzel bir topluluk vardı. Performans sorunları çözmek için ufacık küçük 1 veya 2 piksel fırçaları kullandım ve işimi şöyle karaladım:

resim açıklamasını buraya girin

Bu arada yazara performansı artırmak için yazılım önerileri vermeye devam ettim ve önerilerimin bellek optimizasyonları ve algoritmaları vb. Hakkında konuşurken özellikle teknik nitelikte olduğunu fark ettim. Bu yüzden aslında bir programcı olup olmadığımı sordu ve evet dedim ve beni kaynak kodu üzerinde çalışmaya davet etti.

Bu yüzden kaynak koduna baktım, çalıştırdım, profilli ettim ve dehşetime, yazılımı "soyut piksel arayüzü" kavramı etrafında tasarlamıştı IPixel, ki bu, dinamik olan her şey için en üst sıcak noktaların arkasındaki kök neden oldu. her bir görüntünün her bir pikseli tahsis eder ve gönderir. Yine de, tüm yazılımın tasarımını yeniden düşünmeden bunu optimize etmenin pratik bir yolu yoktu çünkü tasarım onu ​​soyutlarımız tek bir soyut pikselin tanecik düzeyinde çalıştığında mikro-optimizasyonların en önemsiz ötesinde bir köşeye sıkışmıştı. ve her şey bu soyut piksele bağlı.

Bence bu "sağduyu" nun ihlali ama açıkçası geliştirici için pek de sağduyu değildi. Ancak, en temel kullanım durumlarının bile milyonlarca, pikseller veya parçacıklar veya devasa bir ordu simülasyonundaki küçük birimler gibi somutlaşacağı böyle ayrıntılı bir şeyleri soyutlamamak gibi. İyilik IImageya da (tüm görüntü / piksel o hantal toplam seviyesinde ihtiyaç biçimlerini işleyebilir) IParticleSystemiçin IPixelveya IParticle, sonra da en temel ve hızlı-to-yazma ve bu tür arayüzler arkasında uygulamalarını basit anlaşılır yapılır ve koyabilirsiniz daha sonra tüm yazılımın tasarımını yeniden düşünmeden optimize etmek için ihtiyaç duyacağınız tüm solunum odasına sahip olun.

Ve bugünlerde gördüğüm gibi amaç bu. Yukarıdaki çevrimdışı oluşturucular gibi tuhaf durumlar hariç tutulursa, mümkün olduğunca geç görüş bilgisiyle (ölçümler de dahil olmak üzere) mümkün olduğunca geç optimize etmek için yeterli solunum odasına sahip tasarımlar yapın ve gerekli optimizasyonları mümkün olduğunca geç uygulayın.

Tabii ki, ortak kullanıcı sonu durumlarda kolayca önemsiz bir boyuta ulaşan girdiler üzerinde ikinci dereceden karmaşıklık algoritmaları kullanarak başlamanızı önermiyorum. Bunu zaten kim yapıyor? Ancak, uygulamanın daha sonra değiştirilmesi kolaysa, bunun çok büyük bir şey olduğunu düşünmüyorum. Herhangi bir tasarımı yeniden düşünmeniz gerekmiyorsa, bu hala ciddi bir hata değildir.


0

Bu, performansın uygulamanız için ne anlama geldiğine bağlıdır. Ayrıca, uygulamanız işlevsel olarak tamamlanmadan performansı optimize etmenin mümkün olup olmadığı konusunda.

Çoğu zaman, daha iyi bir şey yapana kadar endişelenmemelisiniz, ancak uygulamanızın başarısı için belirli bir performans düzeyi kritik olabilir. Eğer durum buysa ve kolay olmayabileceğinden şüpheleniyorsanız, "hızlı başarısız" uğruna performansa bakmaya başlamalısınız.

Herhangi bir proje için önemli bir ilke, öncelikle sert parçalara odaklanmaktır. Bu şekilde, eğer bunu yapamazsanız, erken bileceksiniz ve tamamen farklı bir şey denemek için zaman olacak veya proje çok fazla harcanmadan önce iptal edilebilir.


0

Performansın hızdan daha fazla olduğunu öne süreceğim. Ölçeği içerir (yüzlerce ila eşzamanlı kullanıcı). Bir üretim yükü aldığında uygulamanın depolanmasını istemediğinizden emin olabilirsiniz. Performans, uygulamanın ne kadar kaynak (örneğin bellek) tükettiğini içerir.

Performans da kullanım kolaylığıdır. Bazı kullanıcılar 10 saniyede 1 tuş vuruşu görevi 2 saniyede 2 tuş vuruşundan daha fazla yapar. Bunun gibi şeyler için tasarım liderinize sorun. Bu tür şeyleri kullanıcılara erken götürmek istemiyorum. Vakumda X diyebilirler, ancak işlevsel bir ön sürümle çalıştıklarında Y diyebilirler.

En iyi bireysel hız, veritabanı bağlantısı gibi bir kaynağı tutmaktır. Ancak ölçek için bağlantıyı mümkün olduğunca geç edinmeli ve mümkün olan en kısa sürede serbest bırakmalısınız. 3 şeyi almak için veritabanına yapılan bir gezi, veritabanına yapılan 3 ayrı geziden daha hızlıdır.

Oturum sırasında değişmeyen bilgiler için yolculuk yapıyor musunuz? Eğer öyleyse oturum başlangıcında alın ve hafızada tutun.

Koleksiyon türünü seçerken işlevselliği, hızı ve boyutu göz önünde bulundurun.

Bir koleksiyondaki öğeleri tutmanız gerektiğinden emin misiniz? Sık karşılaşılan bir sorun, bir dosyadaki tüm satırları bir listeye okur ve listeyi her seferinde bir satır işler. Dosyayı her seferinde bir satır okumak ve listeyi atlamak çok daha etkilidir.

Bir kez döngü yapabileceğiniz ve üç şey yapabileceğiniz zaman üç kez döngü yapıyorsunuz.

Geri arama ile başka bir iş parçacığında işlem yapmanız gerekebilecek bir nokta var mı? Eğer öyleyse, derhal tasarım gereksinimlerine müdahale etmiyorsa, kodu bu ihtiyaca göre paketleyin.

Birçok performans da temiz koddur.

Erken optimizasyon var ve sadece gerçekten daha fazla zaman almayan sağduyu şeyler yapıyor.

Veritabanında erken optimizasyon gördüğüm yerdir. Bir hız problemi olmadan önce hızın normalleşmesini önler. Aldığım argüman, tabloyu daha sonra değiştirirsek, o zaman her şeyi değiştirmeliyiz. Genellikle, verileri bu şekilde sunar ve daha sonra normalleştirilmemiş bir tablo için değiştirilmesi gerekebilir.

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.