Modern hesaplamanın yapıldığı günlerde, 'tipik iş uygulamalarında' - performans neden önemlidir? [kapalı]


29

Bu, bazılarınız için garip bir soru gibi görünebilir.

Ben bir hobi Java programcısıyım. Birkaç oyun, müzik üreten bir AI programı, resim için başka bir program ve benzeri şeyler geliştirdim. Bu size programlama konusunda deneyimim olduğunu, ancak ticari uygulamaların profesyonel gelişiminde olmadığını söylemek içindir.

Bu sitede performans hakkında çok fazla konuşma görüyorum. İnsanlar genellikle bir görevi gerçekleştirmek için C # 'da en etkili algoritmanın ne olacağını veya Python'un neden yavaş ve Java'nın daha hızlı olduğunu vb.

Anlamaya çalıştığım şey: bu neden önemli?

Performansın neden önemli olduğunu gördüğümde belirli bilgi işlem alanları var: sürekli güncelleme döngüsünde her saniye onbinlerce hesaplamanın gerçekleştiği oyunlar ya da işletim sistemleri ve sanal makineler gibi diğer programların dayandığı düşük seviyeli sistemler.

Ancak normal, tipik üst düzey işletme uygulaması için performans neden önemlidir?

Yıllar önce neden önemli olduğunu anlayabiliyorum. Bilgisayarlar çok daha yavaştı ve daha az belleğe sahipti, bu yüzden bunları dikkatlice düşünmek zorundaydınız.

Ancak bugün, yedeklenecek çok fazla hafıza var ve bilgisayarlar çok hızlı: belirli bir Java algoritmasının O (n ^ 2) olması gerçekten önemli mi? Aslında bu tipik işletme uygulamasının son kullanıcıları için bir fark yaratır mı?

Tipik bir iş uygulamasında bir GUI düğmesine bastığınızda ve sahnelerin arkasında, modern hesaplamanın bu günlerinde bir O (n ^ 2) algoritması başlatır - aslında verimsizliği hissediyor musunuz?

Sorum ikiye bölünmüş durumda:

  1. Uygulamada, bugün performans normal bir normal iş programında önemli mi?
  2. Eğer öyleyse, lütfen bana performans ve optimizasyonların önemli olduğu böyle bir uygulamadaki gerçek dünyadan örnekler verin.


Performans düşükse önemlidir.
Mike Dunlavey,

Yanıtlar:


40

Haklısın, iş uygulamalarındaki performans çoğu programcının konuştuğu şekilde gerçekten önemli bir konu değil . Genellikle, programcılardan duyduğum performansla ilgili tartışmaların birkaç sorunu var:

  • Bunlar çoğunlukla erken optimizasyondur . Genellikle, herhangi biri açıkça sebepsiz bir işlem yapmak için "en hızlı yolu" ister ve herhangi bir şekilde derleyicilerin çoğunda (örneğin, çarpma veya bir yöntemi kullanarak bölmeyi değiştirme gibi) kod değişikliği yaparak veya değişiklik yaparak günlerini harcayarak bitebilir çalışma zamanında birkaç mikrosaniye kazanmaya yardımcı olacaktır.

  • Genellikle spekülatiftirler . Yığın Taşması ve Programlayıcılar'da bunu gördüğüme sevindim.SE , soru performansla ilgili olduğunda sıkça profilden bahsedilir, ancak performansla ilgili hangi profillerin tartışıldığını bilmeyen iki programcı gördüğümde de hayal kırıklığına uğrarım. kodlarında yapmaları gereken ilgili değişiklikler. Değişikliklerin her şeyi daha hızlı hale getireceğine inanıyorlar, ancak pratik olarak her seferinde gözle görülebilir bir etkisi olmayacak veya işleri yavaşlatacak, bir profilci onları kolayca optimize edilebilecek ve% 80 israf eden kodun başka bir bölümüne yöneltecek Zamanın

  • Sadece teknik yönlere odaklanırlar. Kullanıcı odaklı uygulamaların performansı şu duygu ile ilgilidir: hızlı ve duyarlı hissediyor mu, yoksa yavaş ve tıkalı mı? Bu bağlamda, performans sorunları genellikle kullanıcı deneyimi tasarımcıları tarafından çok daha iyi çözülür: basit bir animasyonlu geçiş genellikle her ikisi de 600 ms harcarken, aynı zamanda oldukça yavaş hisseden bir uygulama ile yanıt veren bir uygulama arasındaki fark olabilir. işlemi yapıyorum.

  • Teknik kısıtlarla ilgili olsalar bile, öznel unsurlara dayanırlar. Hızlı ve duyarlı hissetme sorunu değilse, bir işlemin belirli bir sistemde çalışan belirli verilerde ne kadar hızlı yapılması gerektiğini belirleyen, işlevsel olmayan bir gereksinim olmalıdır . Gerçekte, daha çok şöyle olur: yönetici, yavaş bir şey bulduğunu söyler ve daha sonra geliştiricilerin bunun ne anlama geldiğini bulması gerekir. "Şu anda on saniyeyi boşa harcarken 30 msn'nin altında olması gerekir" ya da "süresi ondan dokuz saniyeye düşürebiliriz" gibi yavaş mı?

Bir programcı olarak kariyerimin başlarında, bir grup müşterim için bir yazılım parçası üzerinde çalışıyordum. Bu yazılımın dünyaya mutluluk getirecek bir sonraki harika şey olduğuna ikna olmuştum, bu yüzden performanstan endişe duydum.

"Profil oluşturma" veya "kıyaslama" gibi terimler duydum, ancak ne anlama geldiklerini bilmiyordum ve daha az umursayamazdım. Dahası, C ve özellikle de optimizasyon tekniklerinin tartışıldığı kısmı hakkında kitap okumaya çok odaklandım. Bilgisayarların bölmeden daha hızlı çarpma yaptığını keşfettiğimde, bölmeyi yapabileceğim herhangi bir yerde çarpma ile değiştirdim. Bir yöntemi çağırmanın yavaş olabileceğini keşfettiğimde, önceki 100 LOC yöntemi zaten bir sorun çıkarmamış gibi, olabildiğince fazla yöntemi birleştirdim.

Bazen geceleri, kimsenin istemediği yavaş bir uygulama ile herkesin indirmek ve kullanmak istediği hızlı bir uygulama arasında fark yaratan ikna edilmiş değişiklikler yaparak geçirdim. Bu uygulama ile ilgilenen iki gerçek müşterinin gerçek özellikler istemesi beni rahatsız etmiyordu: "Uygulama yavaşsa kim bir özellik ister?" - diye düşündüm.

Sonunda, sadece iki müşteri uygulamayı kullanmayı bıraktı. Tüm çabalarıma rağmen şaşırtıcı derecede hızlı değildi, çünkü hangi dizinlerin ne olduğunu ve uygulamanızın veritabanı yoğun olduğunu bilmiyorsanız, yanlış bir şey var. Birkaç mikrosaniye ayda bir kez kullanılan kod yürütme tarafından düzelmekte sadece başka performansa ilişkin bir değişiklik, yapıyordu Neyse, müşteriler vermedi bkz değişiklikleri. Gördükleri, kullanıcı deneyiminin korkunç olduğu, dokümantasyonun eksik olduğu, aylarca istedikleri önemli özelliklerin burada olmadığı ve çözülmesi gereken hataların sayısının artmakta olduğuydı.

Sonuç: Bu uygulamanın dünyadaki binlerce şirket tarafından kullanılacağını umuyorum, ancak bugün internette bu uygulama hakkında herhangi bir bilgi bulamayacaksınız. Sadece iki müşteri onu terk etti ve proje de terk edildi. Hiçbir zaman pazarlanmadı, hiçbir zaman kamuya açıklanmadı ve bugün, bilgisayarımda derleyebileceğimden bile emin değilim (ya da orijinal kaynakları bulamıyorum). Gerçekten önemli olan şeylere odaklanırsam bu olmazdı.

Bu söyleniyor, genel olarak performans önemlidir :

  • Ticari olmayan uygulamalarda, çok önemli olabilir. Orada gömülü yazılımları , yazılım koştu sunucularına (eğer varsa büyük performans başlar endişe kaynağı olmaya değil saniye başına isteklerinin birkaç bin), yazılım ran akıllı telefonlar , video oyunları , profesyoneller için yazılım (sap deneyin Photoshop'ta ikna edilmek için çok hızlı olmayan bir makinede 50 GB'lık bir dosya ve çok sayıda insana satılan sıradan yazılım ürünleri bile (Microsoft Word yaptığı her işlemi yapmak için zamanının iki katını harcarsa, kaybedilen zaman sayıyla çarpılır) kullanıcıların bir sorun haline gelecektir).

  • İş uygulamalarda, bir uygulama birçok durumlar vardır hissediyor ve olduğu yavaş kullanıcılar tarafından nefret edilecektir. Bunu istemezsiniz, endişeleriniz üzerinde performans gösterirsiniz.


4
Özellikle cevapsız perfomance tartışmalarına ve anlamsız optimizasyonlara odaklanmasından dolayı büyük cevap.
Doktor Brown

1
a simple animated transition may often be the difference between an app which feels terribly slow and the app which feels responsive- Her ne kadar bunlar kesinlikle dikkatli kullanılsalar da, her gün animasyonları ve geçişleri sürükleyen uygulamalar için, günlük olarak bu geçişlere bakarken sinir bozucu olabilir!
Kozmik Ossifrage

Teklifinizin kaynağı nedir?
Adam Johns,

1
@AdamJohns: kaynak yok. Henüz blogumda yayınlanmayan kendi makalelerimin taslaklarından alıntı.
Arseni Mourzenko

@MainMa Oh harika. Anladığım kadarıyla gösterimin tadını çıkardım.
Adam Johns

44

Evet. Evet öyle. Çalışma zamanı hızı, sahip olmanız gereken tek endişe değil ve 1982'deki gibi ya da hala düşük güçlü gömülü sistemlerde olduğu kadar önemli değil, ama her zaman bir endişe ve anlamanız önemlidir. neden bu böyle.

Birincisi, bahsettiğiniz asimptotik karmaşıklık, bir programın girdi büyüklüğü arttıkça davranışını tanımlar . 10 maddeyle uğraşan doğrusal olmayan bir program gereksiz işler yapmaktan kurtulabilir, ancak bir gün 1000 ile uğraşmak zorunda kaldığınızda sizi ısırır, çünkü daha yavaş, ama çok daha yavaş görünmeyecektir . Ve (kapsamlı analiz ve kıyaslama olmadan) bu noktanın 100 maddede mi, 1000 maddede mi, 100,000 maddeye çarpıncaya kadar mı olacağını bilmiyorsunuz. İnanması zor olabilir, ama elbette en iyi algoritmayı seçmek, her tahminde bu noktayı tahmin etmekten ve uygulamanızı bu tahmine bağlı olarak seçmekten çok daha kolaydır.

Ayrıca, lütfen kullanıcı deneyimi temellerini okuyun. Bir programla etkileşimin, yanıt sürelerine (10ms, 100ms, birkaç saniye vb.) Bağlı olarak nasıl algılandığını belirleyen iyi araştırılmış eşikler vardır. Bu eşiklerin geçip karşıdaki uygulamanızdan ayırmak üzere kullanıcılarda neden ve insanlar tekel yazılım yazma mutlu konumda olmadıkça olacak olması kullanımına da müşteri kaybına yol açtığı için, ayrılan kullanıcıların negatif işletme değerine doğrudan çevirir.

Bunlar sadece profesyonel programcı nedenlerinden birkaçıdır gerekir algoritmik karmaşıklık hakkında bilmek ve sorumluluk sahibi bir biçimde. Bugünlerde, zaman aşımına uğramak ve zaman açısından kritik bir iç döngü olduğu ortaya çıkmadıkça, özellikle optimize edilmiş, kötü okunabilir bir kod programlamak için genellikle gerekli değildir, ancak kesinlikle, kesinlikle gerekli olandan daha yüksek bir karmaşıklık sınıfını çalıştırmamalısınız işi yapmak için.


2
Akılda tutulması gereken başka bir şey de algoritma seçimini tekrarlamaktır: kütüphaneler ve soyutlamalar nedeniyle, zaten sizin için ya da en azından "başlık altında" birçok algo seçimi yapılmıştır. Performans üzerindeki etkilerini hala bilmelisin. Ve bu performans önemli .
joshin4colours,

14

Evet öyle!

Sizden örnekler istediğinizden beri, birkaç günlük durum akla geliyor:

  1. Büyük verileri kullanma : Birçok iş uygulaması, veri tabanları tarafından desteklenir ve çoğu durumda bu veri tabanları verilerle taşar. Ve sürücü boşluğu ucuz olduğu için, kaydedilen ve saklanan verilerin miktarları delilik. Daha geçen hafta bir müşteri, sadece ortalama rakamlar gösterdiğinde (bazı milyon satırın üzerinde sorgular ...) başvurusunun çok yavaş olduğundan yakınıyordu. saatler. Geçen yıl algoritmik bir optimizasyon, bir partinin işlem süresini 8 saatten 4 saate düşürdü, şimdi artık gündüz vardiyasına uymuyor!

  2. Duyarlılık : Kullanılabilirlik çalışmaları (eğer zamanım varsa, ux.se'daki ilgili sorulara bağlantılar ekleyeceğim ...), kullanıcı memnuniyetinin duyarlılıkla yoğun bir şekilde ilgili olduğu konusunda çalışmalar yapıldı. 200ms ile 400ms arasındaki tepki süresindeki bir fark, sizi rakiplerinize bırakan müşterilerinizin büyük bir yüzdesine kolayca mal olabilir.

  3. Gömülü Sistemler : Bilgisayarlar daha hızlı olmuyor, gittikçe yavaşlıyorlar ^ _ ^ Mobil geliştirmenin uygulama geliştirmede çok büyük etkisi var. Elbette modern Masaüstü bilgisayarlarda Jelly Beans gibi bellek ve CPU döngüleri atabiliriz, ancak şimdi patronunuz uyku analiz algoritmasını meraklı bir saatte veya SIM Kartta uygulamanızı istiyor ...


4

Uygulamada, bugün performans normal bir normal iş programında önemli mi?

Tipik bir normal iş programı nedir bilmiyorum. Bildiğim kadarıyla, kullanıcıların programlarımızı her zaman planladığımızdan çok daha fazla veriyle besleyerek (genellikle ne kadar büyük olduklarını ve bir güvenlik marjı eklediklerini belirttikten sonra) ve bu durumda doğrusal bir artış beklediklerini çalışma zamanı, oturum açma davranışını kabul edin ve uygulamanın başka bir şey olduğunda donmasından şikayet edin. Sonuç olarak , POV'lerinden tüm giriş verilerinin işlenmesi gerektiği açıkça görülmesi durumunda istisna olan girişin boyutundan daha fazla dikkate alma eğilimindedirler .

Yani evet, performans, en azından karmaşıklık düzeyinde, önemlidir. Karmaşıklık sınıfının içindeki mikro-optimizasyon, rekabetten gözle görülür şekilde daha kötüyseniz (bazı pazarlardaki ölçütlerde veya ham algı ile) istisna olmanız dışında, önemli değildir - "anlık" sınıfındaki değişimin sınıfını anında değil, kullanıcının anında değil başka bir şeye geçmeyin "," kullanıcının işlemlerin akışını kesintiye uğrama riskiyle karşı karşıya kalması için yeterince yavaş "," kullanıcının görevi başlatması için yeterince yavaş ve zaman zaman denetleyin "," yeterince yavaş kullanıcının görevi öğle yemeğinde, gece boyunca, hafta sonu boyunca başlatmayı planladığını "(").


4

Modern iş uygulamalarında, performans sorunları CPU veya bellek eksikliği şeklinde değildir. Ancak bunlar ağ gecikmeleri, G / Ç performansı ve hepsini gizleyen soyutlamalar şeklindedir. Her şey, tasarımın ne kadar iyi olduğuna ve geliştiricilerin ne kadar deneyimli olduğuna bağlıdır. Basit bir CRUD uygulaması bile, bir sorgu çalıştırmak yerine DB'den bir satır çekiyorsa durdurabilir (N + 1 sorunu olarak da bilinir).

Sorun, iyi bir tasarıma ve deneyimli geliştiricilere sahip olmanın pahalı olmasıdır. Ayrıca, tahriş olmuş kullanıcılara sahip olmak, gerçek performans optimizasyonlarına yatırım yapmaktan çok daha ucuzdur. Müşterilerin yüksek performans gerektireceği bazı durumlar vardır (örneğin, web tarayıcıları), ancak nadiren yaygın iş uygulamaları için geçerlidir.


3

Sunucu tabanlı uygulamalar için, aynı anda bir şeyler yapmaya çalışan yüzlerce, binlerce hatta milyonlarca kullanıcının olabileceğini unutmayın. Böyle bir durumda verimdeki küçük bir tasarruf, hizmet talepleri için gereken donanım miktarını büyük ölçüde etkileyebilir.


5
Aslında çoğu sabit faktör, soruna daha fazla donanım atarak daha iyi çözülür, çünkü daha fazla donanım genellikle şeyi optimize etmekten daha ucuzdur. Sorun kötü asimptotik (ölçeklendirme) davranış, çünkü daha fazla donanım atmak bu konuda pek yardımcı olmayacak.
Jan Hudec

3
Yalnızca bir kez optimizasyon yaparsınız, ancak elektrik faturasını her ay ödersiniz.
Jaydee

2
@JanHudec: Şu anda bulunduğunuz web sitesi (sevgili Yığın Değişimimiz), dünya genelinde ayda yalnızca 25 sunucuda 560 milyon sayfa görüntüleme sunuyor .
Mehrdad

2
@Mehrdad: Ve bunun yerine C'ye yazmış olabilirler ve belki de 25 yerine 20 sunucuya koyabilirlerdi. Fakat tasarruflar, artan geliştirme süresinden daha ağır basmayacağı için yapmadılar. Birçok web servisi Python ve PHP'de uygulanmaktadır, bunlar genel kullanımdaki en yavaş dillerden bazılarıdır, ancak hiç kimse bunları daha hızlı bir şekilde yeniden yazmayı düşünmez, çünkü artan geliştirme süresi işe yaramaz. Sabit faktörler çoğu zaman sadece daha fazla donanım atarak çözülebilir. Ölçekleme (asimptotik) problemleri elbette başka bir konudur.
Jan Hudec

3
... Adil olmak gerekirse, homurdanan işlerin çoğunu yapan veritabanı, hızlı gitmek için yazıldı ve optimize edildi.
Blrfl

3

Kesinlikle çok önemli.

Asıl mesele, GUI öğelerinin iki kez veya üç kez ( entegre grafiklerde önemli olan !) Gereksiz yere gecikme yaşanması gibi (örneğin , grafikler için önemli olan !) Veya sadece programın yapılması çok uzun sürdüğü için, kullanıcı için can sıkıcı olmak değildir . yapar (çoğunlukla ilgi çekici şeyler). Tabii ki, bu da bir konudur.

Üç önemli yanılgı vardır:

  1. Çoğu tipik iş bilgisayarı "çok daha güçlü" değildir . Tipik bir iş bilgisayarı, kick-ass grafik kartı ve 16GB RAM ile 8 çekirdekli bir i7 değil . Bir orta sınıf mobil işlemciye, tümleşik grafiklere, 2 GB ana belleğe (şanslıysanız 4 GB), 5400 RPM diskine ve Windows'ta çalışan çeşitli gerçek zamanlı virüsten koruma ve politika uygulama yazılımlarına sahip kurumsal bir sürümüne sahip bir dizüstü bilgisayardır. arka fon. Veya, çoğu danışman için, "bilgisayar" sadece iPhone ...
  2. Çoğu "tipik işletme kullanıcısı" teknisyen değildir, 10-12 çapraz referans sekmesi, 150 sütun ve 30.000 satır içeren bir elektronik tablo oluşturmanın etkilerini anlamadılar (bu rakamlar tahmin edebileceğiniz kadar gerçekçi değildir!) Ve onlar ya da bilmek istemiyorum. Sadece yapacaklar.
  3. Kaybedilen ikinci bir maliyet , kesinlikle yanlış bir varsayımdır.

Eşim böyle bir "tipik iş ortamı" nın üst kısmında çalışıyor. Kullandığı bilgisayar, çalışma süresinin yaklaşık 3.5 saati kadardır. Microsoft Outlook'un başlatılması - iyi bir günde - hazır olana kadar yaklaşık 3 dakika (sunucular yoğun yük altında iken 6-8 dakika). Bahsedilen bu 30k-satır-e-tabloların bazıları, bilgisayarın "dondurulmuş" olduğu bir değeri güncellemek için 2-3 saniye sürer (Excel'in başlangıçta açılması ve açılmasının ne kadar süreceği! Masaüstü paylaşırken daha da kötü. Beni SAP'ye bile alma.
Kesinlikle yüz bin insanın iş günü başına 20-25 dakika bir şey beklemeden kaybetmesi önemli. Bunlar milyonlarca kayıpBunları kaybetmek yerine, temettü olarak ödeyebilirsiniz (veya daha yüksek ücret ödersiniz).
Elbette, çalışanların çoğu maaş seviyesinin en altında, ancak daha düşük bitiş zamanında bile para .


3

Yıllar önce neden önemli olduğunu anlayabiliyorum. Bilgisayarlar çok daha yavaştı ve daha az belleğe sahipti, bu yüzden bunları dikkatlice düşünmek zorundaydınız.

N ^ 2'nin ne kadar hızlı büyüdüğünü hafife alıyor gibisin. Diyelim ki bir bilgisayarımız var ve N ^ 2 algoritmamızın N = 10 olduğunda 10 saniye sürdüğü. N, 10 saniyelik orijinal çalışma süresine ne kadar daha büyük olabilir ve hala sığabilir? Şimdi 24 maddeyi kaldırabiliyoruz, iki katın biraz üzerinde. Sistemimizin 10 kat daha fazla maddeyle ne kadar hızlı işlem yapması gerekiyor? 100 kat daha hızlı olması gerekirdi. Veriler oldukça hızlı büyür ve N ^ 2 algoritmaları için bilgisayarın donanım ilerlemesini ortadan kaldırır.


Başka bir örnek: Eğer bir elemanın işlenmesi 30 CPU döngüsü veya 10ns alırsa (ki bu oldukça ucuzdur), algoritma zaten sadece 10000 elemanınız varsa tam bir saniye sürecektir. 10000 element pek çok bağlamda fazla değildir.
CodesInChaos

1

İşyerinde kullandığımız 3. parti iş programlarının miktarına inanmazsınız ve bunların çoğu benim kişisel standartlarımla karşılaştırıldığında gülünç derecede yavaşlar. Programlar evde kullandığım bir şey olsaydı, onları uzun zaman önce alternatif bir programla değiştirirdim.

Bazı durumlarda, bazı programlar bir gün içinde kaç görevi başarabileceğimi doğrudan etkilediğinden ve bu sayede verimliliğimi ve faturalandırılabilir kalemleri düşürdüğümden, fark doğrudan maliyete düşüyor. Bu yüzden iş programlarında da en azından gelir için sınırlayıcı bir öğe olmayacak kadar performans göstermenin oldukça önemli olduğunu söyleyebilirim.

Bir örnek, çalışmanın 15 dakikalık aralıklarla (servis masası) ölçüldüğü olay yönetimidir. Program, bir bileti 15 dakikadan daha uzun sürecek bir itmeye itecek kadar yavaşsa (asıl iş dahil), süreci oldukça yavaşlatır. Bunun bir nedeni, kullanıcı bir işlem yaptığında (çözünürlük ayrıntılarını doldurma, çalışma bilgilerini güncelleme veya benzeri) basitçe "bir süre bekleyen" yavaş bir veritabanı erişimi olabilir. Acil zehirlenme vakalarında hastane hastalarının detayları gibi yavaş programların daha kritik olayları bile etkileyebileceği durumlar olduğunu hayal edebiliyorum - belki de ilaç alerjileri ya da?


1

Diğer cevapların birçoğu konuyu oldukça kapsamlı bir şekilde ele alıyor, bu yüzden nedenleri ve gerekçelerini onlara erteliyorum. Bunun yerine, algoritmik bir seçimin gerçek çıkarımları olabileceğini göstermek için gerçek hayattan bir örnek vermek istiyorum.

http://windowsitpro.com/windows-xp/svchost-and-windows-update-windows-xp-still-problem

Bağlantılı makalede, Windows XP güncellemelerini hesaplamak için algoritmadaki bir hata anlatılmaktadır. Windows XP'nin ömrünün çoğu için güncelleme algoritması iyi çalıştı. Algoritma, bir yamanın daha yeni bir yamanın yerini alıp almadığını hesaplar ve bu nedenle yüklü olması gerekmez. Ancak, sonlara doğru, değiştirilen güncellemelerin listesi çok uzadı *.

Güncelleme algoritması, her yeni güncellemenin öncekinden ( ) hesaplanması için iki kat sürdüğü, üsteldi . Listeler 40 güncelleme aralığına (* uzun ) girdiğinde, güncellemeleri kontrol etmek tam kapasiteyle çalışıyor, 15 dakika kadar sürdü. Bu, güncelleme sırasında birçok XP makinesini etkili bir şekilde kilitledi. Daha da kötüsü, güncellemeler yüklenmeye başladığında, algoritma 15 dakika daha sürecek şekilde tekrar çalışacaktı . Birçok makine Otomatik Güncelleme ayarına sahip olduğundan, bu durum makineleri her önyüklemede 15 dakika, potansiyel olarak belirli bir periyotta tekrar kilitleyebilir.O(n) = 2n

Microsoft, bu sorunu çözmek için hem kısa vadeli kesmeleri (güncelleme listesinden öğeleri kaldırarak) hem de uzun vadeli düzeltmeleri kullandı. Bu önemliydi çünkü Windows'un en son sürümleri aynı algoritmayı kullanıyordu ve bir gün aynı problemle karşı karşıya kalabilirdi.

Burada bir algoritma seçiminin gerçek sonuçları olduğunu görebiliriz. Yanlış algoritma, ürünün ömrü boyunca iyi olsa da, yol boyunca olumsuz etkilere neden olabilir.


0

Performansla ilgili sorulan soruların miktarını, iş uygulamalarında performans gereksinimlerinin, performansın iyileştirilmesinin zor olduğunu kabul etmek yerine önemli olduğunun bir göstergesi olarak yorumladığını düşünüyorum . Sadece işe almak kaba kuvvet teknikleri, deneme yanılma ya da örnek kodun kopyalanması ve yapıştırılmasıyla gerçekleştirilebilir.

Bir şey daha hızlı çalışana kadar herkes şanslı olabilir ve değişiklik yapmaya devam edebilir, ancak bu nadiren işe yarar. Tecrübelerin yetersizliği nedeniyle geliştiriciler dış yardım görecekler Bazı ortamlarda performans iyileştirmeleri benzersiz bir sorundur, bu nedenle StackOverflow gibi bir sitede belirli bir soru sormak tek seçenek olabilir. Ayrıca, birçok danışman bu tür sorunları çözerek bu sorunları çözerek paralarını kazanıyor.


-1

Bu, "iyi performans" ı nasıl tanımladığınıza bağlıdır. Algoritmalarınız her zaman mümkün olan en iyi karmaşıklığı kullanmalıdır. Ortalama kafenizi hızlandırmak için kötüye kullanım boşlukları. Etkileşimli bir programda mümkün olan yerlerde tamponlama ve önyükleme / ön derleme.

Başka bir "iyi performans" tanımı daha var: Karmaşıklık sınıfınızın sabitlerini optimize etmek. Burası C ++ unvanını aldığı, insanların Java'yı yavaş aramaya başladıkları,% 5 daha az çalışma zamanının kutsal kâse olduğu görülüyor. Bu tanımı kullanarak haklısın. Bilgisayar donanımı zamanla daha da karmaşıklaşırken, derleyiciler daha iyi ve daha iyi hale geliyor. Bir noktada, düşük uç kodunu derleyiciden daha iyi bir şekilde optimize edemezsiniz - bu yüzden bırakın ve algoritmalarınıza odaklanın.

Bu noktada Java / Haskell / C ++ kullanarak başka bir tasarım kararı olur. Numara çekimi GPU'nuzdaki OpenCL üzerinden yapılabilir. Kullanıcı Arabirimleri sürekli zaman algoritmalarına ihtiyaç duyar ve iyidir. Çıktı ve modülerlik, sınıflarınızı% 20 daha iyi önbellek kullanımı için ayarlamaktan daha önemlidir. Multithreading önemlidir, çünkü insanlar hızlı bir uygulama istemiyorlar, duyarlı bir uygulama istiyorlar. Önemli olmayan, uygulamanızın olabileceğinden% 10 daha yavaş olması. % 50 bile iyidir (ancak insanlar soru sormaya başlar). Doğruluk, cevap verme ve modülerliğe odaklanın.

Programlamayı Haskell veya en azından işlevsel bir biçimde (C ++ dilinde bile) seviyorum. Tüm programınız için kolayca test yazabilmek, toplu işlerde biraz daha hızlı olmaktan çok daha önemlidir.


-1

Oldukça basit: maliyet

Önceki işverenim, fiziksel sunucularda SaaS modeli olarak barındırılan bir öğrenme yönetim sistemine sahipti. JVM'nin yığını eski makineler için 2 GB, yeni makineler için 3 GB olarak ayarlandı ve makine başına birkaç örnek kullandık. Bunun yeterli olacağını düşünürsün.

Başlamadan önce, sistemi duyarlı ve ölçekli hale getirmekten sorumlu bir performans ekibi vardı. Veritabanından sürekli sorguladığımız belirli veri parçaları olduğunu buldular. Bir sütunu almak için çoğu sorguya katıldığımız bir tablo bile vardı. Bu veri nadiren değişti.

Sorun şu ki, birlikte çalışacak 2 GB'ımız vardı. Bu yüzden bariz çözüm, sık okunan verilerin tümünü önbelleğe almaya başlamaktır. Sonra gemiye binmeden hemen önce başlayan bellek sorunları vardı.

Bu konuda 2 düşünce okulu vardı:

  1. Hafıza ve donanım genel olarak bugünlerde ucuz. Sadece daha fazla RAM satın alın, böylece daha fazla önbellek alabilirsiniz.
  2. Bir öğrenme yönetim sistemi neden 3+ GB RAM'e ihtiyaç duyuyor? Bunların hepsi SQL sorgular yayınlar, kursları başlatmak için yönlendirmeler gönderir ve öğrencilerin kurslar içindeki ilerlemelerini değerlendirir.

İkinci tartışma kazandı ve bir yıldan fazla bir süre boyunca hafıza kullanımımızı ayarlayarak geçirdim.

Mevcut işverenim ayrıca bir öğrenme yönetim sistemine de ev sahipliği yapıyor, ancak onu biraz farklı bir şekilde barındırıyor. Ölçeklenebilirlik o kadar düşüktür ki, tek bir kurulum (4 yüke bağlı sanal sunucuya bölünmüş) yalnızca 80 müşteriyi idare edebilir. Daha büyük müşterilerimizden bazıları kendi sunucularını bile alıyor. Buna yol açan sorunların çoğu, CPU döngülerinin tümünü barındıran SQL sorguları, bellek sızıntıları, aynı şeyi birden çok kez yapan gereksiz kodlar gibi performans sorunlarıdır. Tek amacı kötü performans göstermediğinde sunucuları yeniden başlatmak olan dahili bir uygulamaya bile sahibiz. Bu aracı koruyan bir çalışan var (diğer sorumluluklarla birlikte).

Yukarıda bahsettiğim ilk düşünce okuluna abone oldular: daha fazla donanım atmak, çünkü donanım maliyetleri, geliştirici maaşlarından daha ucuzdur.

Bu beklendiği gibi ekonomik olarak işe yaramadı. Donanım, yazılım lisansı ve sunucuları işlemek için destek personeli arasında, geliştiricinin zaman profil kodunu harcamaktan kaçınmak için her yıl milyonlarca dolar harcadık.

Katıldığımda, uygunluk sorunumuzu çözmekten sorumlu oldum. Kullanılabilirlik sorunlarımızın çoğu düşük performanstan dolayı olduğundan, kodumuzu ayarlama performansım oldu ve ölçeklenebilirlik çok daha iyi çalışma süresiyle önemli ölçüde iyileştirildi. Yoğunluğu arttırmaya başlamaya hazırız. Söylemeye gerek yok, maaşım bir milyona yakın değil (dilerim!), Bu yüzden performansın bana göre ayarlanması için para harcamak, bize yılda milyonlarca tasarruf sağlamakla sonuçlanacak.

TL; DR

Kapsamlı bir maliyet / fayda analizi yaparsanız, kodu düzeltmenin daha ucuz olduğunu göreceksiniz. Görmezden geldiğiniz bilinen bir performans sorunu teknik borca dönüşüyor .


1
Her maliyet / fayda analizi "kodu düzelt" ile sonuçlanmayacaktır. Programcılar çok pahalıdır ve eğer bir programcının maliyetinden daha azına RAM ekleyebilir ve problemi hala çözebilirseniz ...
Robert Harvey

Bulut barındırma durumlarına girerken, güç için ne kadar para ödediğinizi görmeniz çok güzel. Örneğin veritabanı için Amazon RDS kullanıyoruz. En büyük ve en büyük ikinci örnek arasındaki fark yaklaşık. Yılda 3500 $. Bu, inceleyebileceğiniz ve optimize etmek için çok fazla zamanlayıcıya değip değmeyeceğine karar verebileceğiniz bir sayıdır.
Carson63000

@RobertHarvey Doğru, bundan kesinlikle kaçınmamalıydım. Söylemek istediğim, "donanım dev zamandan daha ucuzdur" mutlaklığı kesinlikle doğru değildi, ama haklısın, bazen doğru olabilirdi.
Brandon,

-2

Sorunuzu şöyle anladım: Yeterince iyi performanslar elde etmek için (yani, kullanıcılar mutlu ve arka uçlarım tıkanmaz), algoritmik karmaşıklık teorisini anlamam gerekir mi?

"Tipik" işletme uygulaması ile ne kastettiğinize bağlıdır. Çoğu durumda, özellikle basit CRUD benzeri bilgi sistemleri, cevap hayır olurdu. Bunlar için "basitçe" (bazen zor olabilir) performans darboğazlarını izleyebilmeniz gerekir: veritabanımdaki bir dizini özledim mi? Ağ üzerinden çok fazla veri gönderir miyim? "Angular.js" ön yüzümde bin dolar var mı? Bu, sağlam bir mimari oluşturmak, teknolojinizin yığınını iyi tanımak ve anlamsızlıktan kaçınmakla ilgilidir. Bunu, bir bilgisayar bilimcisi olmak zorunda değil, mutlaka bir zanaatçıysanız elde edebilirsiniz. Bunu söylemenin bir başka yolu da, Oracle sorgu iyileştiricisini yapanların algoritmik karmaşıklık işleriyle uğraştığını, sadece size sağladıklarını doğru kullanmanız gerektiğidir.

Şimdi istisnalar var. Büyük verilerden veya makine öğrenmesinden bahsediyorsak, ne yaptığınızı bilmeniz ve yalnızca sizin için mevcut olan varsayılan algoritmaları kullanmanız gerekmiyor. Ön uçta bile, gelişmiş veri görselleştirmeleri oluşturmaya başlarsanız, bazıları doğrusal olmayan bir karmaşıklık maliyeti (ör. Kuvvet düzeni çizelgeleri) anlamına gelebilir.

Günümüzde bu istisna gittikçe yaygınlaşmakta ve bunlarla başa çıkabilecek insanları ararken pazar oldukça kurudur. Yani: evet, hiçbir bilgisayar bilimi geçmişi olmadan başarılı olabilirsiniz, ancak bazıları ile daha da fazla olacaksınız.


-2

Diğer cevaplayıcılar temel noktaların çoğunu kapsıyor, ancak paralelleştirilebilen görevler için, verimsiz yazılımlar, daha fazla güç kullanan ve daha fazla alan ve bakım gerektiren daha fazla sunucu biçiminde artan donanım maliyetlerine yol açıyor.

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.