Bir çözümün verimli bir çözüm olması önemli midir?


9

Çoğu problemi çoğunlukla Top Coder'dan çözüyorum. Birçokları için cevap alacağım, ancak çoğu zaman verimsiz bir çözüm buluyorum.

Gerçek dünyadaki uygulamalarda - soruna bir çözümün etkili olması gerçekten önemli mi? Varsa nasıl geliştirebilirim?


4
Yarışma açısından mı yoksa gerçek dünyadaki uygulamalar açısından mı soruyorsunuz?
rjzii

@RobZ: gerçek dünya uygulamalarında
Ant'ın

1
"gerçek dünya" çok fazla yer kaplar. Gömülü? Sunucu uygulamaları? Mobil uygulamalar? Tek kullanıcılı kişisel bilgisayar yazılımı? Bilimsel simülasyonlar? Cevaplar mutlaka onlar için aynı değildir.
David Thornley

Yanıtlar:


34

En iyi çözüm, (artan önem sırasına göre) verimli, sürdürülebilir ve yapılabilir çözümdür .

^ ^ ^ Bu cevaptan almanız gereken tek şey budur.

Verimlilik önemlidir . Belki de donanım bolluğumuzdan dolayı eskisinden biraz daha az, ancak Performans bir Özelliktir . Bir yarışmada verimlilik açıktır. Etkili kodun nasıl yazılacağını bilmelisiniz. Daha da önemlisi, bir uygulamanın zamanında veya sürekliliğinden ödün vermeden verimli, iyi performans gösteren kod sağlayacak en iyi uygulamaları bilmelisiniz. Burası gerçekten bir platform ve dil ile ilgili derinlik deneyiminin birçok verim getirdiği yerdir.

Daha da önemlisi (vakaların% 95'inde), bitmiş, sürdürülebilir bir çözüme sahip olmak. Bitmiş bir ürün olmadan , çözümün ne kadar verimli veya bakım yapılabilir olduğu önemli değildir . Bir hatayı izlemek ve düzeltmek veya yeni bir özellik eklemek için size olağanüstü bir zaman gerekiyorsa, çözümün ne kadar verimli olduğu önemli değildir. Ancak, ne olursa olsun, verimlilik ve performans kuşkusuz önemlidir.


3
Evet. Hem doğru hem de tamamlanmış korkunç verimsiz bir program, size gelişmelerinizi test etmek için bir şey verir.
Mike Sherrill 'Cat Recall'

1
Bunun en önemli kısmı, verimliliği kişisel olarak sürdürülebilirliğin üzerine koyacağım veri tabanı geliştirmede verimlilik için en iyi uygulamaları bilmek. Kullanıcılar performansla umutsuzca ilgileniyorlar. Sıklıkla daha verimli kodun bakımı daha zor olarak görüldüğünü gördüm, ancak geliştiricinin başlamak için daha verimli kodu anlamaması nedeniyle, teknikleri öğrendikten sonra, ilk tercih olarak bu tekniklere gidersiniz ve onlar niçin işe yaradıklarını anladığınız için onlar için daha kolay hale gelirler.
HLGEM

@HLGEM Eğer bu cevabın genel prensip olarak (ilk satırın yanı sıra) pekiştirmek istediğim herhangi bir kısmı varsa, etkili kod yazmak için en iyi uygulamaları bilmek demektir. Ve SQL'in verimli olmasıyla ilgili yorumda haklısınız.
Mike Cellini

8

Mike Cellini ile aynı fikirdeyim, ekleyeceğim tek şey.

Bir şey "yeterince verimli" mi? Örneğin, kullanıcı açısından bakıldığında, 0.00001 saniyede tamamlanan bir işlev ile biri diğerinden çok daha verimli olmasına rağmen 0.1 saniyede tamamlanan bir işlev arasında fazla bir fark yoktur. 10 dakika içinde tamamlanan bir işlev (kullanıcı için) 12 dakika içinde tamamlanan işlevden çok farklı değildir. Her iki durumda da kullanıcı bir fincan kahve alır veya başka bir göreve başlar.

Verimliliği etkili bir algoritma değil, "verimli bir kullanıcı" olarak görmeye geldim.


Duyduğum başparmak kuralı bir kullanıcı tarafından% 20 iyileşme fark edilebilir olduğunu. Bunların her ikisi de yeterli gibi görünüyor, sanırım bir kullanıcı aslında .1 ve .00001 saniye arasında yanıt verme konusunda bir fark hissedebilir.
Chris Pitman

Chris, bir kullanıcının iki sistem arasındaki farkı yan yana fark edebileceği konusunda haklı olabilirsiniz, ancak bir sistem kullanıcıyı işinde fark edilir şekilde daha verimli hale getirir mi? Benim gözlemim (bunu 25 yılı aşkın süredir yapıyorum), iki sistemin kullanıcının belirli bir zamanda aynı miktarda işi yapmasını sağlayacağıdır.
Jaydee

2

Genel olarak, bir soruna en önemli çözüm, gerçekte var olan ve sorunlarınız için var oldukları için geçerli olanlardır. Başka bir deyişle, verimsiz kodunuz veya daha hızlı olması gereken etkin kodunuz olduğunu bilinceye kadar erken optimizasyondan kaçının .

Ayrıca, uygulamanız için en iyi çözümün genel durum çözümü olmayabileceğini unutmayın. Vaka ve nokta, birkaç yıl önce bir profesör, sınıfımıza verilen bir türün ilk 10 sayısını basacağımız bir sorun verdi (üzgünüm, hafızam tipe göre beni başarısızlığa uğrattı, ancak daha sıradışı sayılardan biriydi) ) ve sayının verilen tür olduğundan emin olmak için bir test yaptık. Bu bize verilen sorunun kapsamıydı ve bize ertesi gün tam kredi almak en verimli çözüm nedeniyle söylendi. Aşağıdaki ders profesör sonuçları özetledi:

  • Bazı öğrenciler, sayıların doğru olduğundan emin olmak için basit bir döngü kullandılar ve sağlanan formülü kullandılar ve gösterdiler, yavaş ama işi yaptılar, O (n ^ 3).
  • Diğer öğrenciler araştırmalarını yaptılar ve verilen bir sayının geçerli olduğundan emin olmak için daha iyi bir kontrol işi yapan bir formül buldular, bu programlar çok daha hızlı koştu, O (n ^ 2).
  • Bir öğrenci, değerleri oluşturmak için yavaş formülü kullandı ve ardından kodlarında sabit bir diziye kopyaladı ve içeriğini görüntüledi, O (n).

Nihai çözüm profesör tarafından en verimli şekilde değerlendirildi. Sorunun aslında problemi tam olarak anlamak ve sadece dışarı çıkmak ve en verimli çözümü bulmak değil, bir alıştırma olduğu ortaya çıkıyor.

Yukarıdakilerin amacı, etkili bir çözüm bulmak söz konusu olduğunda, sorun çıkmadan ve kod yazmadan veya kodu optimize etmeye çalışmadan önce sorunun ne olduğunu gerçekten anladığınızdan emin olmak için zaman harcamak genellikle daha iyidir. Bir dizi referans değeri sabit bir dizide saklayabiliyorsanız, bunu performans açısından bazı süslü algoritmalar yazmaya çalışmaktan daha iyidir.

Aynı şekilde, çoğu uygulama için, verimsiz kodu (gereksiz yere verimsiz olmadığı zaman!) Görme eğiliminde olan kişilerin geliştiricilerin kendileri olduğunu unutmayın. Sadece tam olarak yapması gereken şeyi yapan temiz kod yazarsanız, oranlar kullanıcıların çoğu zaman programınızla çalışırken performans sorunlarını fark etmeyecekleri ve sadece bahsettikleri parçaları optimize ettiklerinde sen.


2

Bu yarışmanın yapısına bağlıdır, ancak genellikle, evet: performansı göz göre çoğu zaman olduğu onların belgelerine . Bazen, daha sonraki bağlantıda olduğu gibi, avlamak zorundasınız, ancak alıntı yapmak için:

Temiz, anlaşılır, verimli kod yazın. Özellikle bunun için herhangi bir inceleme satır öğesi olmasa da, yorumcular yine de okumaları ve anlamaları kolay olan kodlara daha iyi tepki vermeleri muhtemeldir. Verimli kod ile, stres ve kıyaslama testinde potansiyel bir performans avantajının yanı sıra yorumculardan olası kudolar (ve birkaç ekstra puan) elde edersiniz.

Bunu geliştirmenin en iyi yolu, zaten yaptığınız verimli kod yazmaktır. Çalışmayı tamamlasanız bile, rekabetten sonra bile verimliliğini artırmak için zaman harcayın ve bu da işe yarayacaktır.

Muhtemelen size iki şey verebilecek algoritmalar üzerine kitaplar gibi teoriye yatırım yapmak istersiniz : belirli bir sorunu çözmek için daha etkili araçlar ve çözmek zorunda olduğunuz sorunun ne olduğunu belirlemek için daha verimli mekanizmalar.

Son olarak, bilgisayar bilimleri kursları giderek daha fazla çevrimiçi olarak sunulmaktadır ve geliştirmeniz gereken arka planı kapsamaktadır.


Algoritma tasarım kılavuzunun daha yeni bir sürümü var. (İkisi arasında 11 yıl). Yeni olanla ilgili bir sorun mu var? Özellikle eskisinden daha ucuz olduğu için. Eğer öyleyse, cevabınızda bu ele alınmalıdır.
Dünya Mühendisi

Hayır, Amazon'da bulduğum ilkini listeledim ve ikinci baskı olup olmadığını kontrol etmeyi zahmet etmedim.
Daniel Pittman

1

Bir çözümün ne kadar verimli olması gerektiği bir dizi faktöre bağlıdır. En büyük şey, kullanıcının ne istediğini bilmektir. İşte birkaç örnek.

  1. Bir kod bloğunun tek kullanıcısıysanız ve sizin için iyi çalışıyorsa, muhtemelen iyisinizdir.
  2. Programınız satılacaksa, aklınızda bir hedef platform olması gerekir. Bu platformla test edin. Program son derece yavaşsa, daha verimli hale getirmek için çalışmanız gerekir. Size iyi geliyorsa, diğer kullanıcılara verin ve kabul edip etmediklerine bakın.
  3. Belki de programın başka düşünceleri vardır. Sunucu tabanlı bir program oluşturuyorsanız, programı olabildiğince verimli hale getirmek için çok çalışmanız gerekebilir. Veya, bir mikroişlemci üzerinde çalışıyorsa, orada da çalıştığından emin olun.

Kodunuzu nasıl daha verimli hale getirebilirsiniz:

  1. İlk adım, neyin en fazla zaman aldığına dair bir fikir edinmek. İşin püf noktası profil kodu adı verilen bir şey yapmaktır. En fazla zaman alan şeyi arayın ve daha hızlı çalışmasını sağlayacak bir yol bulup bulamayacağınızı görün.
  2. Belki de anahtar sınırlayıcı faktör hafızadır. Durum buysa, büyük bellek yığınlarını neyin kaptığına bakın ve onu nasıl azaltabileceğinizi görün.

Optimizasyon için bir alan var, ancak yukarıdaki iki ipucunun en azından başlamanız gerekir.


1

Bir yarışma için hakimlerin kim olduğunu ve ne hakkında olduklarını anlamanız gerekir - eğer büyük kodlayıcılar ve daha fazlası için arıyorsanız, daha verimli kod için kudos alacaksınız.

Kural olarak, gerçek dünyada önemli değil. Yazılım geliştirmenin temel fikirlerinden biri, "Bilmediğiniz şeyi optimize etme ihtiyacı optimize etmeyin", ardından "Yalnızca gerekli olduğu kanıtlandığında optimize edin" dir.

Birçok uygulayıcı, bunun kolayca düzeltilemeyen şişirilmiş, verimsiz bir koda yol açtığını ve bazı kenar durumlarda (çoğu kodlayıcı her gün bütün gün yaptığı gibi bu olacaklar) haklı olduklarını iddia edeceklerdir. Ancak pek çok yazılım geliştirme projesinin sonuçları ölçülmemiştir "Performans: Gerekenden daha hızlı, Maliyet: Kimin umurunda, Teslimat süresi: Bazen bu on yıl", Gerçek dünyada, genellikle "Ucuz istiyorum, dün istiyorum, istiyorum çalışmak ".

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.