Ne için optimize ediyorsunuz? [kapalı]


19

Genel olarak, yazılım tasarlarken tipik olarak ne tür optimizasyonlara yönelirsiniz?

Tasarımınızı en iyi duruma getirmek için tercih ettiğiniz tür siz misiniz?

  • Geliştirme süresi (yani hızlı yazma ve / veya bakımı daha kolay)?
  • İşlem süresi
  • Depolama alanı (RAM, DB, Disk vb.)

Tabii ki bu, çözülmekte olan sorunların türü ve son teslim tarihleri ​​ile son derece özneldir, bu yüzden bir başka optimizasyon biçimini seçmenizi sağlayacak nedenleri duymak isterim.


Yukarıdakilerin üçü de ama genel olarak atmak istiyorum (bu bakımla ilgilidir). Örneğin, yazılımınızın ihtiyaçlarına geniş ölçüde uygulanabilir, gerçekten etkili bir veri yapısı tasarlamak ve bunu kapsamlı bir şekilde test etmek için zaman ayırdığınızda, size yıllarca hizmet eder ve bireyin çözümüne dar olarak uygun çok daha fazla veri yapısı yazmanıza engel olur sorunları.

Yanıtlar:


40

Bakım

Daha sonra gerekirse profil oluşturun ve hız için optimize edin. Nadiren hiç depolamaya ihtiyacım oldu - en azından son 10 yılda. Ondan önce yaptım.


8
+1, başlangıç ​​için sürdürülebilirlik için optimize ederseniz, daha sonra gerekli olduğu takdirde daha sonra hız veya depolama için optimize etmek daha kolay olacaktır.
Carson63000

Son derece aşırı bir yaklaşım seçmemek için en azından işlem süresini ve depolamayı düşünmeniz gerekir .

@ Thorbjørn, geliştirici süresini optimize ediyorsanız, muhtemelen (muhtemelen daha fazla) belirli bir dilde okunması / yazılması daha kolay olan algoritmaları seçersiniz. Ancak daha sonra ve yalnızca performans bir sorun haline gelirse, ikiniz de (@Tim'in söylediği gibi) bir profil oluşturucu alacaksınız.
Jason Whitehorn

@ Jason, kesinlikle katılmıyorum. Uygun bir uygulamayı seçmeniz için seçtiğiniz algoritmaların performans özelliklerine aşina olmalısınız. Yani, öncelikle posta kodlarını aramak için ihtiyacınız olduğunda bir ArrayList seçmek iyi ölçeklenmeyebilir.

1
@ Thorbjørn, seninle aynı fikirde değilim. Aslında, eldeki algoritmalara dikkat edilmesi gerektiğinde haklı olduğunuzu düşünüyorum. Bununla birlikte, görüşlerde farklılık gösterdiğimiz nokta, bence hangi algoritmaların seçileceği fikrinin tecrübe yoluyla öğrenilen ve sadece bir sorun ortaya çıktığında çözülen bir şey olduğudur. Doğru, doğru, daha az okunabilir / daha uzun kod uygulamak pahasına bunun için optimize etmek gerek görmüyorum.
Jason Whitehorn

27

Geliştirme Zamanı

İşleme ve depolama ucuzdur. Sizin zamanınız değil.

Sadece not:

Bu, kodu hızlı bir şekilde bitirmek için kötü bir iş yazmak anlamına gelmez. Bu, kodu hızlı gelişimi kolaylaştıracak şekilde yazmak anlamına gelir. Ayrıca tamamen kullanım durumlarınıza da bağlıdır. Bu, iletişim formu olan basit, iki veya üç sayfalık bir web sitesi ise, muhtemelen bir PHP çerçevesi kullanmanıza gerek yoktur. Birkaç içerir ve bir posta betiği gelişimi hızlandıracaktır. Plan bunun yerine, büyümek ve yeni özellikler eklemek için esnek bir platform oluşturmaksa, düzgün bir şekilde yerleştirmek ve buna göre kodlamak için zaman ayırmaya değer çünkü gelecekteki gelişimi hızlandıracaktır.

İşleme süresi ve depolama ile doğrudan karşılaştırmada, daha hızlı bir geliştirme süresine yöneliyorum. Collectionutils çıkarma işlevini kullanmak, koleksiyonları çıkarmak için en hızlı ve bellekte en verimli yöntem midir? Hayır! Ancak daha hızlı geliştirme zamanı. Performans veya bellek darboğazlarıyla karşılaşırsanız, bunları daha sonra çözebilirsiniz. Neyin optimize edilmesi gerektiğini bilmeden önce optimizasyon yapmak zaman kaybıdır ve buna karşı savunuyorum.


4
Moore yasası yaklaşık iki yıl önce sona erdi. Eşzamanlılık hakkında düşünmeye ve bu ekstra çekirdekleri kullanmaya başlamanın zamanı gelmiş olabilir. Gelecekte ucuz saat döngüleri elde etmenin tek yolu budur.
Robert Harvey

3
Doğru olmak gerekirse, Moore yasası yaklaşık olarak her 2 yılda bir bir yonga üzerindeki transistör sayısının iki katına çıkmasıyla hala güçlenmekte, bu da tek bir kalıp üzerine birden fazla çekirdeğin yerleştirilmesini mümkün kılmaktadır. Biten, saniyede artan sayıda çevrimin 'ücretsiz öğle yemeği'.
Dominique McDonnell

1
"İşleme ve depolama ucuzdur." CPU önbelleği ve veri yolu hızı değildir. Onlar bugün ana performans darboğazları.
mojuba

3
Buna tamamen katılıyorum. Okunabilir kodun korunması, görev için uygun araçların kullanılması ve şirketinizin kararlaştırılan standartlarına uyulması, aslında bir bilgisayara kod yazmak için harcadığınız zamanı önemli ölçüde azaltarak şirketinize bir ton para kazandırır. Zamanın mühendislik yazmaktan daha iyi harcanmasıdır.
Matt DiTrolio

1
@ Fatura: Veya gömülü olarak yapıyorsanız, bunları aşarsanız ürün maliyetini önemli ölçüde artıracak zor sınırlarınız olabilir. Veya sunucu yazılımı için, bazen - birisi Google sunucularındaki işlemeyi% 1 artırabilirse, bu biraz tasarruf sağlar.
David Thornley

12

Kullanıcı deneyimi.

Müşteriniz için önemli olan tek değer budur.

Geliştirme Süresi daha az önemlidir. Tam özellikli bir komut satırı uygulamasını bir GUI'den çok daha hızlı yazabilirim, ancak Bayan Jane istediği raporları nasıl tüküreceğini nasıl anlayamazsa, işe yaramaz.

Bakım daha az önemlidir. Bir tahterevalli gerçekten hızlı bir şekilde onarabilirim, ancak bir ormanın ortasındaysa, kullanıcılar bulamaz.

İşlem Süresi daha az önemlidir. 60 saniyede 0'dan ışık hızına giden bir araba yaparsam, kullanıcılar yönlendiremez.

Estetik daha az önemlidir. Bir Mona Lisa boyayabilirim, ama bir duvarın arkasına saklanmışsa kimse onu göremez.

Kullanıcı Deneyimi önemli olan tek değerdir. Kullanıcının beklediği şekilde tam olarak ne istediğini yapan bir uygulama yapmak nihai başarıdır.


Üzgünüm Joeri, düzenlememde biraz uzaklaştım.
Malfist

Bir şey için bir topluluk wiki'si, değil mi? ;)
Joeri Sebrechts

8

Optimize edilecek tek bir şey var ve bu:

Müşterileriniz ne istiyor?

Müşterilerinizin mümkün olan en hızlı programa ihtiyacı var mı? Hız için optimize edin.

Müşterilerinizin mutlak güvenilirliğe ihtiyacı var mı? Bunun için optimize edin.

Yarın teslim edilmeleri gerekiyor mu yoksa işe yaramaz mı? Geliştirme hızı için optimize edin.

İnanılmaz derecede küçük bir kaynak kısıtlı cihazda mı çalışıyorsunuz? Bu kaynaklar için optimize edin.


Tek yakalama, genellikle ne istediklerini bilmedikleri veya neyin mümkün veya yararlı olduğu konusunda beklentileri olduğu.
Tim Williscroft

1
Ve bu çoktan seçmeli soru serisi sorulduğunda, çoğu zaman sadece "evet" duyacaksınız :-)
Jason Whitehorn

1
Kolay olduğunu söylemedim. Ve en azından sorarsanız, yararlı bir cevap alma şansınız var.
DJClayworth

5

işlem süresi

Kullanıcımın zamanı ucuz değil. Etrafta ne var ne yok.


Geçen yıl kullandığım bir uygulamayı yeni güncelledim. Uygulamayı tamamen yeniden yazmışlardı ve oğlan yavaştı. Sonunda hızlı bir şekilde çalıştırmak için yeni bir bilgisayar almak zorunda kaldım. Bunun ucuz olmadığını garanti ederim, ama zamanım daha değerli.


İşlem süresi eğik ilginç almak. Ne tür uygulamalar geliştirdiğinizi paylaşmak ister misiniz? İlgilendim.
Jason Whitehorn

1
Çok sayıda bilgisayarda çalışıyorsanız işlem süresi önemlidir . Fazladan bir 2 ay geçirdikten optimize veya daha yeni donanıma 10.000 PC'ler yükseltme arasında bir seçim Örneğin, bu durumda geliştiricinin zaman yok değil dışarı kazanmak. Ama elbette, bu bir uzlaşma. Yalnızca yarım düzine sunucuda çalıştırıyorsanız, geliştiricinin zamanı muhtemelen bu durumda kazanır.
Dean Harding

1
@Jason, şu anda kolayım var, Excel ve VBA ile elektronik tabloların bir araya getirilmesinde (hızla yoğunlaşıyorum) çalışıyorum. Kullanıcılarım yan odada çalışıyor ve herhangi bir sorunum olursa bana haber veriyorlar. Benim bakış açım, otuz yıl boyunca bilgisayar kullanmaktan ve uygulamaları izlemeye devam etmekten geliyor, yükseltmeleri çok telafi etmeye zorluyor. Geliştiricilerin daha iyisini yapabileceğini biliyorum, sadece etkili kod yazma alışkanlığına sahip olmalılar.

Etkin kod için +10. Bu, özellikle modüler programlamada çok sık göz ardı edilir. Her modül makul bir hızda çalışır, ancak hepsinin toplamı korkunç derecede yavaş olabilir.
Joris Meys

4

Bellek tüketimini ve tahsislerini sınırlama eğilimindeyim. Eski okul olduğunu biliyorum, ama:

  • Yazdığım ıskarta olmayan kodun çoğu büyük ölçüde paralel. Bu, aşırı bellek tahsisi ve çöp toplama etkinliğinin başka türlü paralelleştirilebilir kodu serileştireceği anlamına gelir. Ayrıca, paylaşılan bir bellek veri yolu için çok fazla çekişme olacağı anlamına gelir.
  • Birincil dilim, henüz iyi bir 64 bit desteğine sahip olmayan D'dir (ancak bu düzeltilmektedir).
  • Düzenli olarak oldukça büyük veri kümeleriyle çalışıyorum.

Bloatware'i önlemek için çalışmak için +1. Bellek atma programları kötü programlardır.

Bellek hoglama programları genel olarak 64 bit sistemlerde çalıştırılabilir. Uygulamalarımızdan biri bellek sorunlarıyla karşılaştığımızda bunu yaptık (yasal olarak büyük miktarda bellek kullanıyor). İlk mermi noktası performans olduğunda önemlidir.
David Thornley

2

Verimliliği geliştirme zamanı, gelecekteki sürdürülebilirlik, kullanıcı deneyimi ve tüketilen kaynaklar arasında bir uzlaşma olarak tanımlanan verimlilikle optimize ettiğimi söyleyebilirim. Bir geliştirici olarak, bir tür dengeyi korumak için bunların hepsini dengelemeniz gerekir.

Bu dengeyi nasıl elde edersiniz? İlk olarak, son tarihin ne olduğu, uygulamanızın hangi donanımda çalışacağı ve ne tür bir kişinin kullanacağı gibi birkaç sabit oluşturmanız gerekir. Bunları bilmeden, doğru dengeyi kuramaz ve nerede gerekli olduğuna öncelik veremezsiniz.

Örneğin, güçlü bir makinede bir sunucu uygulaması geliştiriyorsanız, taşınmaz bir son teslim tarihine ulaştığınızdan emin olmak için performans verimliliğini değiştirmek isteyebilirsiniz. Ancak, geliştiriciniz kullanıcı girişine hızlı bir şekilde yanıt vermesi gereken bir uygulama (bir video oyunu düşünün) ise, gecikmeli olmadığından emin olmak için giriş rutininize öncelik vermeniz gerekir.


2

Hangi sanallaştırma teknolojisini kullanıyorsam

512 MB'den fazla RAM'e sahip sistemlerin kanama kenarı olarak kabul edildiği günleri hatırlıyor musunuz? Günlerimi önceden kod yazarak geçiriyorum.

Çoğunlukla Xen ortamında ayrıcalıklı etki alanında çalışan düşük düzeyli programlarda çalışıyorum. Ayrıcalıklı alan için tavanımız 512 MB olup, geri kalan RAM'i müşterilerimizin kullanması için boş bırakır. Ayrıcalıklı etki alanını yalnızca bir CPU çekirdeğiyle sınırlamak bizim için tipiktir.

İşte buradayım, yepyeni bir $ 6k sunucu üzerinde çalışacak kod yazma ve her programın 100kb tahsis edilmiş tavanda (ideal olarak) çalışması veya dinamik bellek tahsisinden tamamen kaçınması gerekiyor.

Kısaca, aşağıdakiler için optimize ediyorum:

  • Bellek alanı
  • Sıralar (kodumun çoğunun zamanının çoğunu geçirdiği yer)

Kilitleri beklemek, G / Ç'yi beklemek veya sadece genel olarak beklemek için harcanan zaman söz konusu olduğunda da gayretli olmalıyım. Zamanımın önemli bir kısmı, mevcut engelleme olmayan soket kitaplıklarını geliştirmeye ve kilitsiz programlama için daha pratik yöntemlere bakmaya gidiyor.

Her gün, 15 yıl önce yaptığım gibi, geçen ay satın alınan sistemlerde, teknolojideki gelişmeler nedeniyle kod yazmamın biraz ironik olduğunu düşünüyorum .

Bu, gömülü platformlarda çalışan herkes için de tipiktir, ancak bunların çoğunda bile en az 1GB kullanımdadır. Jason'ın belirttiği gibi, mobil cihazlarda çalıştırılacak programlar yazarken de tipiktir. Liste devam ediyor, Kiosklar, ince istemciler, resim çerçeveleri vb.

Donanım kısıtlamalarının, programcıları gerçekten bir şeyleri gerçekten tükettiklerini umursamadan çalıştırabilecek insanlardan ayırdığını düşünmeye başlıyorum. Endişeliyim (aşağı gerekirse bana oy verin) tamamen soyut tip ve hafızayı kontrol eden ortak akıl havuzuna hangi dillerin farklı disiplinlerin programcıları arasında paylaşıldığı (eskiden).


1
Hafıza ayağı baskı açısı için +1. Hiç uğraştığınız kısıtlamalara karşı kodlamadım, ancak Xen hakkında konuşan ilk bölümü kaldırın ve iPhone ile değiştirin ve tam olarak nereden geldiğinizi biliyorum :-)
Jason Whitehorn

2

Araştırma sonuçları

Bir akademisyen olarak, optimizasyon yaptığım şeyi paylaşmam gerektiğini düşündüm. Bunun daha kısa bir geliştirme süresi için optimize etmekle aynı olmadığını unutmayın. Genellikle bu, çalışmanın bazı araştırma sorularını destekleyebileceği, ancak teslim edilebilir, cilalı bir ürün olmayabileceği anlamına gelir. Bu, kalite ile ilgili bir sorun olarak görülebilir ve birçoğunun (akademik) bilgisayar bilimcilerinin neden "gerçek dünya" deneyimi olmadığını söylediğini açıklayabilir. (Örn., "Teslim edilebilir bir ürünün nasıl geliştirileceğini bilmiyorlar mı?" )

Güzel bir çizgi. Etki açısından, çalışmanızın başkaları tarafından kullanılmasını ve alıntılanmasını istiyorsunuz ve Joel'in Buzdağı Etkisi devreye giriyor: biraz cila ve parlaklık uzun bir yol kat edebilir. Ancak, başka projelerin üzerine inşa edilmesi için bir temel oluşturmuyorsanız, teslim edilebilir bir ürün yapmak için harcanan zamanı haklı çıkaramayabilirsiniz.


1
  1. tasarlamak
    • düşük bağlantı, modüler
    • özlü, iyi tanımlanmış, işlevsel alanlar
    • iyi belgelenmiş
    • rijitlik için sürekli refaktör
  2. Bakımında
    • tekrarlanabilir yapı ve hata ayıklama
    • birim testleri
    • regresyon testleri
    • kaynak kontrolü

... ondan sonra her şey

... son olarak, performans için optimize edin ;-)


1

Kalite / Test

Testler için geliştirme programında zaman ve ünite testleri ve özellik / aşamalardan sonra test etme konusunda zaman olduğundan emin olun.


1

Programınızın ihtiyacına bağlıdır.

Yaptığım şeylerin çoğu, kapasiteyi ve belleği işleyerek ağır bir şekilde kısıtlanıyor, ancak ortalama yılda çok fazla önemli değişiklik yapmıyor.

Geçmişte kodun sık sık değiştirildiği projeler üzerinde çalıştım, böylece bu durumlarda sürdürülebilirlik daha önemli hale geliyor.

Ayrıca geçmişte, veri miktarının en önemli sorun olduğu, hatta depolama için diskte olduğu sistemler üzerinde çalıştım, ancak verileri çok fazla veya yavaş bir şekilde taşımak zorunda kaldığınızda daha yaygın olarak boyut bir sorun haline geliyor bağlantı.


1

Zerafet .

Kodunuz iyi tasarlanmışsa, birkaç etkisi olacaktır:

  1. Bakımı daha kolay olacaktır (müşteri için maliyetleri düşürmek)
  2. Optimize etmek daha kolay olacak (JIT veya tam derleyiciler için)
  3. Değiştirilmesi daha kolay olacaktır (daha iyi bir çözüm düşündüğünüzde)

0

Geliştirme zamanı, kesinlikle. Ayrıca bant genişliği için de optimizasyon yapıyorum, ancak ikiliye gitmiyorum.


0

IBM anabilgisayarından PC'lere kadar her şey için birden fazla sistem türüne kurulum yaptığımdan, önce uyumluluk, sonra boyut, sonra hız için optimize ediyorum.


0

Değişir

Gerçek zamanlı bir gömülü video işleme sistemi üzerinde çalışıyorsanız, işlem hızı için optimize edersiniz. Bir kelime işlemci üzerinde çalışıyorsanız, geliştirme süresi için optimize edersiniz.

Ancak, her durumda kodunuzun çalışması ve bakımı yapılabilir olması gerekir.


0

Niyetimin ifadesi.

Kodumu okuyan birinin, etki alanında hangi işlemleri başlatmaya çalıştığımı kolayca görebilmesini istiyorum. Benzer şekilde, taramayı kolaylaştırmak için anlamsız önemsiz önemsiz öğeleri (parantez, js'deki 'işlev' anahtar sözcükleri, vb.) En aza indirmeye çalışıyorum.

Elbette bunu sürdürülebilirlikle dengelemelisiniz. İşlevleri ve her türlü gelişmiş tekniği döndüren işlevler yazmayı seviyorum ve hedefimi daha da ileriye götürüyorlar, ancak fayda hafifse, katı jr programcılarının aşina olacağı tekniklere bağlı kalmanın yanına düşeceğim.


-6

Hepsi

İşlem süresi

Günümüzün bilgisayarları hızlı, ama yeterli olandan çok uzak. Akış medya sunucuları kullanıyorsanız, performansın kritik olduğu birçok durum vardır.

Depolama

Müşterinizin büyük bir diski olabilir, diyelim ki 1 TB. Hangisi 1000 HD film tarafından alınabilir, eğer yeterli olan bir hizmet yapmak istiyorsanız, değil mi?

Geliştirme zamanı

Peki bu "optimizasyon" olarak saymak emin değilim, ben C ++ yerine Java kullanmak ve geliştirme 10 kat daha hızlı olsun.Ben doğrudan bilgisayara doğrudan düşündüğümü söylüyorum, çok düz hissediyorum ileri ve tamamen kayalar!

BTW Geliştirme sürecinizi hızlandırmaya inanıyorum, java'yı seçmelisiniz, asla python gibi çöpleri denemelisiniz ... bu da DEV sürenizi kısaltabileceklerini iddia ediyor.


Bunu ilginç bulabilirsiniz: paulgraham.com/avg.html - programlama dillerinin gücünü tartışır.

3
Sınırlı zaman ve bütçeyle, hepsine zaman harcayamazsınız - bazı öncelikler olmalıdır.
JBRWilkinson

@JRBWilkinson Dava tarafından dava olmalı
tactoth
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.