Algoritmalar (ve genel olarak verimlilik) daha az önem kazanıyor mu?


29

Hesaplama gücü geçmişe göre çok daha uygun olduğu için, algoritmalar ve verimli olmak daha az önem kazanıyor mu? Sonsuz bir döngüden kaçınmak isteyeceğiniz açıktır, yani her şey yolunda gitmez. Ancak daha iyi bir donanıma sahipseniz, daha kötü bir yazılıma sahip olabilir misiniz?


2
"hem evet hem hayır"!
vzn

4
Şimdi uçaklar var ve Atlantik ötesi navlun artık gemilere gitmek zorunda değil, nakliye hızı daha az önemli mi? FedEx ve DHL müşterileri öyle düşünmüyorlar.
Peter Shor

2
Girişin boyutu yeterince büyükse, algoritmalar arasındaki büyüklük sırası farkı ne kadar hızlı olursa olsun önemlidir. Ancak zaman zaman, yalnızca "programlama dili <cough> Python </cough> programlama dilinin sözdizimsel şekeri içine yerleştirilmiş ifadeleri kullanmanın" optimizasyonumdan "daha hızlı olduğunu fark etmek için sabit bir faktör farkını" ortadan kaldırmak "için değişiklikler yapmaya kandırıyorum.
kojiro

ayrıca bkz Moore Yasası
vzn

Buradaki ilginç bir örnek olay, örneğin, bazı / birçok yönden yüksek oranda optimize edilmiş donanımda bile eskisinden daha az verimli çalışan Windows ... moorlar kanununun donanımı iyileştirmesi gibi, yazılımda da bunlara karşılık gelen bir enflasyonist yasa var gibi görünüyor. Modern yazılımlar her geçen gün daha da fazlasını yapıyor, yeni katmanlar ekleniyor ve çoğalıyor ... bir gazın mevcut tüm hacmi doldurma şekline benzeyen bir şey ... veya bir bütçenin her zaman ne kadar büyük veya yüksek olursa olsun kullanıldığı veya biraz taşması ... ayrıca evrim yarışına
vzn,

Yanıtlar:


31

Algoritma verimliliğinin önemini gösteren Algoritmalara Giriş kitabındaki örneği gerçekten çok beğendim :

İki sıralama algoritmasını karşılaştıralım: ekleme sıralama ve birleştirme sıralama . Bunların karmaşıklığı ve O ( n, log n ) = C 2 n- lg , n , sırasıyla. Tipik olarak birleştirme sıralamasının daha büyük bir sabit faktörü vardır, bu yüzden hadi c 1 < c 2 olalım .O(n2)=c1n2O(nlogn)=c2nlgnc1<c2

Sorunuzu yanıtlamak için, bir birleştirme sıralama algoritması çalıştıran yavaş bilgisayar (B) yerine ekleme sıralama algoritması çalıştıran daha hızlı bir bilgisayarın (A) yürütme süresini değerlendiriyoruz.

Varsayıyoruz:

  • giriş probleminin büyüklüğü 10 milyon sayıdır: ;n=107
  • A bilgisayarı saniyede komut yürütür (~ 10GHz);1010
  • B bilgisayarı saniyede yalnızca komut yürütür (~ 10MHz);107
  • sabit faktörler (biraz fazla tahmin edilen) ve c 2 = 50'dir (gerçekte daha küçüktür).c1=2c2=50

Yani bu varsayımlarla

A bilgisayarının107sayıvermesi için4 saniyeve

2(107)2 instructions1010 instructions/second=2104 seconds
107

50107lg107 Talimatlar107 Talimatlar/ikinci1163 saniye

B bilgisayarı için

Böylece 1000 kat daha yavaş olan bilgisayar, sorunu 17 kat daha hızlı çözebilir. Gerçekte, birleştirme türünün avantajı daha da önemli olacak ve sorunun boyutu arttıkça artacaktır. Umarım bu örnek sorunuzu yanıtlamanıza yardımcı olur.

Bununla birlikte, bunların hepsi algoritma karmaşıklığı ile ilgili değildir. Günümüzde sadece makinenin daha yüksek CPU frekansına sahip olması ile kayda değer bir hızlanma neredeyse imkansız. İnsanların iyi ölçeklenen çok çekirdekli sistemler için algoritmalar tasarlamaları gerekir. Bu aynı zamanda zor bir iştir, çünkü çekirdeklerin artmasıyla birlikte bir ek yük de (örneğin, hafıza erişimini yönetmek için) artar. Bu yüzden doğrusal bir hızlanma neredeyse imkansız.

Özetlemek gerekirse, günümüzde verimli algoritmaların tasarımı eskisi gibi eşit derecede önemlidir, çünkü ne frekans artışı ne de ekstra çekirdekler, verimli algoritmanın getirdiğine kıyasla size hız vermez.


4
Doğrusal hızlanmanın imkansızlığının, Amdhal yasasından kaynaklandığı söylenebilir .
Bartosz Przybylski 12:13

f(x)n2i=1nf(xi)nxisO(nn2+n)=O(n3)nO(n2+n)=O(n2)

“1000 kat daha yavaş olan bilgisayar, sorunu 17 kat daha hızlı çözebilir.” Bu, donanım hızını ve farklı algoritmaları aynı anda birleştirdiğiniz için yanlış bir ifadedir. Aksine, her bir sıralama türü için ayrı ayrı A bilgisayarı ile B bilgisayarını karşılaştırın. (Neden Bilgisayar A'da bir birleştirme sıralamasını veya B Bilgisayarında
ekleri

3
@AquaAlex, örneğin amacı, yavaş bilgisayarın sadece seçilen algoritma ile hızlı olandan daha iyi performans gösterdiğini göstermektir. Her bir sıralama türü için yürütme zamanını ayrı ayrı karşılaştırabiliriz veya A üzerinde bir birleştirme sıralamasını ve B'deki sıralamaları çalıştırabiliriz. Ancak, daha hızlı bir bilgisayarın genellikle yavaş olandan daha iyi performans gösterdiğini gösterebiliriz.
Pavel Zaichenkov

Tamam, bu yüzden fikir daha verimli bir algoritmanın hala cpu'nun daha hızlı ve daha büyük hafızasında günümüzde bile ağırlık taşıdığını göstermekti.
AquaAlex

36

Tam aksine. Aynı zamanda donanım daha da ucuzlaşıyor, başka birkaç gelişme daha yaşanıyor.

İlk olarak, işlenecek veri miktarı katlanarak artıyor. Bu, kuasiliner zaman algoritmalarının ve büyük verilerin bulunduğu alanların incelenmesine neden olmuştur . Örneğin, arama motorları hakkında düşünün - çok sayıda soruyu ele almalı, büyük miktarda veriyi işlemeli ve hızlı bir şekilde yapmalılar. Algoritmalar her zamankinden daha önemlidir.

İkincisi, makine öğrenmesi alanı gittikçe büyümekte ve algoritmalarla doludur (BA'nızda öğrendiklerinizden farklı bir tür de olsa). Alan büyüyor ve sık sık gerçekten yeni bir algoritma icat ediliyor ve performansı önemli ölçüde artırıyor.

Üçüncüsü, dağıtılmış algoritmalar daha önemli hale geldi, çünkü CPU işlem hızını arttırmak için bir engel oluşturuyoruz . Günümüzde bilgi işlem gücü paralelleştirilerek arttırılmaktadır ve bu özel algoritmalar içermektedir.

Dördüncüsü, CPU'ların artan gücünü dengelemek için, modern programlama paradigmaları, güvenlik boşluklarıyla mücadele etmek için sanal makine yöntemleri kullanır. Bu, kayda değer bir faktörle bu programları yavaşlatıyor. Bu bilmeceye ek olarak, işletim sisteminiz çan ve ıslıklara daha fazla CPU zamanı harcar, gerçek programlarınız için daha az CPU zamanı bırakır, bu da video sıkıştırma ve dekompresyon gibi CPU yoğun algoritmalar içerebilir. Dolayısıyla donanım daha hızlı olsa da, verimli kullanılmaz.

Özetlemek gerekirse, büyük miktarda veriyi yönetmek için verimli algoritmalar gereklidir; Yapay zeka alanında yeni tür algoritmalar ortaya çıkıyor ; dağıtılmış algoritmalar odağa geliyor; CPU gücü çeşitli nedenlerden dolayı daha az verimli bir şekilde kullanılır (ancak bilgisayarların daha güçlü olması nedeniyle). Algoritmalar henüz ölmedi.


"algoritmalar henüz ölmedi" ... tam tersine "algoritmaların altın çağı" ile yaşama ihtimalimiz var ....
vzn

12

Algoritmaların bilgisi, hızlı algoritmaların yazılmasından çok daha fazladır.

Ayrıca, yeni ve zorlu bir soruna yaklaşırken uygulayabileceğiniz problem çözme yöntemleri (örn. Böl ve yönet, dinamik programlama, açgözlü, azaltma, doğrusal programlama, vb.) Sağlar. Uygun bir yaklaşıma sahip olmak, genellikle yazmak için daha basit ve çok daha hızlı olan kodlara yol açar. Bu yüzden Kevin'ın cevabına katılmıyorum çünkü dikkatlice bir araya getirilmeyen kodlar genellikle yavaş değil aynı zamanda karmaşık. David Parnas'ın bu alıntıyı beğendim:

Sık sık "büyük bir sistemi hızlı bir şekilde kurmayı bilen biri" olarak tanımlanan geliştiriciler duyarım. Hızlı bir şekilde büyük sistemleri inşa etmenin püf noktası yoktur; onları ne kadar çabuk yaparsanız o kadar büyürler!

(Elbette, iyi kodlar yazmak için algoritmaları yazılım tasarım yöntemleriyle de birleştirmemiz gerekir.)

Algoritmaların bilgisi ayrıca verilerinizi nasıl düzenleyeceğimizi de gösterir, böylece veri yapılarını kullanarak bunları daha kolay ve verimli bir şekilde işleyebilirsiniz .

Ayrıca, bize yaklaşımınızın verimliliğini tahmin etmenin ve zamanın karmaşıklığı, alan karmaşıklığı ve kodların karmaşıklığı açısından birkaç farklı yaklaşım arasındaki değişimleri anlamanın bir yolunu sunar . Bu değişimleri bilmek, kaynak kısıtlamaları dahilinde doğru kararı vermenin anahtarıdır.

Yazılım verimliliğinin önemi hakkında Wirth Yasasını anlatacağım:

Yazılım, donanımın hızlandığından daha hızlı bir şekilde yavaşlıyor.

Larry Page kısa süre önce her 18 ayda bir yazılımı iki kat daha yavaş hale getirdiğini ve dolayısıyla Moore yasalarını geçersiz kıldığını söyledi.


7

Evet , onlar 'nispeten' geniş endüstri daha az önemlidir. Metin editörü 'yeterince hızlı' olabilir ve fazla iyileştirmeye ihtiyaç duymayabilir. BT çabalarının büyük bir kısmı, Java'da yazılmış olan A bileşeninin, C ile yazılmış B bileşeniyle çalıştığından emin olmak için gider; Cobol'da (veya başka bir şeyde) yazılan mesaj kuyruğu ile doğru şekilde iletişim kurar veya ürünü piyasaya sürmek vb.

Ayrıca mimari karmaşıklaştı. Döngü başına 1 talimatınızın olduğu ve montajda yazdığınız düz eski basit işlemcileriniz olduğunda, optimizasyonlar kolaydı (sadece talimatların sayısını saymanız gerekiyordu). Şu anda, basit bir işlemciye sahip değilsiniz, ancak tamamen yeniden adlandırılmış ve çoklu seviye önbellek içeren, tam kapsamlı, üst düzey, sıra dışı bir işlemciniz var. Ve derlemede yazmıyorsunuz, fakat C / Java / etc. kodun derlendiği / JIT’nin (genellikle daha iyi bir kod yazması için siz veya ben derlemede yazacağım) veya Python / Ruby / ... 'te kodun yorumlandığı ve makineden soyutlama seviyesinin ayrıldığı bir yerde. Mikrooptimalizasyonlar zordur ve çoğu programcı ters etki yapacaktır.

Hayır , araştırmada ve 'mutlak' terimlerinde her zaman olduğu kadar önemlidirler . Büyük miktarda veri üzerinde çalıştıkları için hızın önemli olduğu alanlar vardır. Bu ölçekte karmaşıklık Pavel örneğinde gösterildiği gibi önemlidir.

Bununla birlikte, başka durumlar da vardır - algoritmalardan 'aşağıya inmek, hız önemli olduğunda (HPC, gömülü aygıtlar vb.) Seçilen bir seçenektir. Derleyiciler ve / veya yazılım optimizasyonu konusunda uzmanlaşmış birçok üniversite grubunda bulabilirsiniz. Örneğin, basit bir döngü sırası takası, yalnızca önbelleği verimli kullandığı için bin zaman hızına ulaşabilir - sınırda bir örnek olsa da, CPU-Bellek aralığı son 30 yılda 1000 kat büyür. Ayrıca Bilgisayar Mimarisi CS'nin bir parçasıdır. Bu nedenle hesaplama hızındaki gelişmelerin birçoğu, genel CS alanının bir parçasıdır.

Endüstriyel tarafta - bir HPC küme hızınız olduğunda, tek bir program günler, aylar veya yıllar boyunca çalışabileceği için önemlidir. Elektrik faturasını sadece ödemekle kalmaz, beklemek de paraya mal olabilir. İki kat daha fazla donanım atabilirsiniz, ancak 700 milyon ABD doları , büyük şirketler dışındaki herkes için bir cep değişikliği sayılmaz - bu gibi durumlarda, programcılar daha ucuz bir seçenektir ve programı yeni bir dilde yeniden yazmak sadece 'küçük' bir hız anlamına gelir - belki bir düşün.

Ayrıca hız daha iyi UX anlamına gelebilir. Cep telefonlarının çoğu incelemesinde OS, hangisinin “daha ​​başarılı” olduğunu ve “hilelerle” yapılabildiğini ve kesinlikle bir çalışma alanı olduğunu belirtiyor. Ayrıca verilerinize daha hızlı erişmek ve ihtiyacınız olanı hızla yapmak istersiniz. Bazen daha fazlasını yapabileceği anlamına gelir - oyunlarda her şeyi yapmak için 0.017 saniyeniz vardır ve ne kadar hızlı olursanız o kadar fazla şeker koyabilirsiniz.


2

Bu ilginç bir tartışma. Ve burada bakmamız gereken birkaç şey var.

  1. Teorik bilgisayar bilimi - Bu gelişen bir bilimdir; zaman geçtikçe sorunları çözmek için yeni ve daha iyi yollar bulacağız, bu da örneğin arama ve sıralama için geliştirilmiş algoritmalar anlamına gelir.

  2. Daha büyük topluluklar / daha büyük kütüphaneler - Başkaları tarafından çok fazla iş yapıldığı için çalışmalarını geliştirebilir ve daha önce oluşturdukları ve hatta kodladıkları algoritmaları kullanabiliriz. Ve bu kütüphaneler zamanla güncellenecek ve daha verimli programlara / algoritmalara otomatik olarak erişebilmeliyiz.

  3. Gelişim - Şimdi burada bir sorunumuz olduğunu düşünüyorum. Pek çok programcı bilgisayar bilimcisi değildir, bu yüzden teknik / teorik değil işletme problemlerini çözmek için kod yazarlar ve örneğin hızlı bir sıralama gibi bir baloncuk türünü kullanmaktan mutlu olurlar. Ve burada donanımın hızı, kötü programcıların kötü algoritmalar ve kötü kodlama uygulamaları kullanarak kurtulmalarına izin veriyor. Bellek, CPU hızı, depolama alanı bu şeyler artık önemli bir konu değil ve her birkaç ayda bir daha da büyüyor, daha hızlı ve daha ucuz hale geliyor. Yeni cep telefonlarına bakmayı kastediyorum. Artık 1970'lerin / 80'lerin ana bilgisayarlarından / sunucularından daha gelişmişler. Daha fazla depolama, daha fazla işlem gücü, daha hızlı bellek.

  4. UI ve DATA - Kullanıcı Arayüzü / Kullanıcı Deneyimi ve DATA artık çoğu geliştirme alanındaki süper verimli koddan daha önemli olarak kabul edilmektedir. Dolayısıyla, hız yalnızca bir kullanıcının uzun süre beklemesi gerektiğinde ortaya çıkar ve yayılır. Kullanıcıya iyi bir görünüm ve his verirsek ve uygulamadan iyi tepki alırsa mutludur. İş dünyası, tüm verilerin güvenli ve güvenli bir şekilde depolandığını bilir ve istedikleri zaman geri alabilir ve değiştirebilir, ne kadar alana ihtiyaç duyduğunu önemsemez.

Bu nedenle, verimli programcıların artık önemli veya gerekli olmadıklarını söylemek zorundayım, sadece çok az sayıda şirket / kullanıcı, insanları süper verimli programcı oldukları için ödüllendirir ve donanımın daha iyi olması nedeniyle, daha az olmaktan kaçınırız. verimli. Ancak, en azından hala verimlilik üzerine odaklanan insanlar var ve toplum ruhu nedeniyle zaman içindeki herkes bundan faydalanıyor.


1

Fenomenin disiplinlerarası ve kesişen yönlerini vurgulayan bu ilginç ve derin soru üzerine başka açılardan . Dai, Wirth'in yasasını cevabından alıntı:

Yazılım, donanımın hızlandığından daha hızlı bir şekilde yavaşlıyor.

Bu fikrin iktisatta gözlemlenen fenomenlerle ilgili ilginç paralellikleri vardır. Ekonominin bilgisayar bilimi ile pek çok derin bağlantısı olduğuna dikkat edin; örneğin, talep üzerine, "yük dengeleme" algoritmalarıyla kıt kaynakların (sayılan konuların vs.) tahsis edileceği zamanlamada. Bir başka örnek, üretici-tüketici sırası adı verilen şeydir. Ayrıca, açık artırmalar.

Ayrıca, örneğin, isimsiz yasaların listesi, Wikipedia :

Parkinson yasası - "Çalışma, tamamlanması için gereken zamanı dolduracak şekilde genişler." Maddeyi de icat eden C. Northcote Parkinson (1909-1993) tarafından “Harcama geliri karşılamak için yükseliyor”. Bilgisayarlarda: Programlar kullanılabilir tüm belleği doldurmak için genişletilir.

Daha verimli Watt buhar motorları Newcomen tasarımının yerini almaya başladıktan sonra enerji kullanımındaki artışta gözlenen Jevon'un paradoksuna da bazı ciddi benzerlikler var, ancak motorların kullanımı veya çoğalması arttı:

Ekonomide, Jevons paradoksu (/ ˈdʒɛvənz /; bazen Jevons etkisi), bir kaynağın kullanıldığı verimliliği artıran teknolojik ilerlemenin, o kaynağın tüketim oranını artırma (azaltma) eğiliminde olduğu iddiasıdır.

Analoji, donanımın kaynak olduğudur ve yazılım kaynağın tüketimi gibidir (yani arz-talep). Bu nedenle, yazılım ve donanım (ve her birindeki gelişmeler), bir anlamda, birbirleriyle, bir anlamda, ortaklaşa , birbirine sıkı sıkıya bağlı bir simbiyotik geribildirim döngüsünde bir şekilde var olur . Bu etkileşimi etkileyen birçok karmaşık ve birbiriyle ilişkili faktör vardır, örneğin:


Neden aşağı oy? Parkinson yasası ve Jevons paradoksunun sözünü çok açıklayıcı buluyorum.
Yuval Filmus

@ YuvalFilmus Benim tahminim: gramer problemleri. Bu sefer cevabı çok fazla okuma yeteneğimi rahatsız etmedim, fakat onu iyileştirmeye çalıştım.
Juho

1
"Dilbilgisi ile ilgili sorunlar" değil, farklı bir tarz. Bu, anadili konuşmacının kendi dilini konuşarak "hatalar" yaptığını söylemek gibidir, aslında ya dil değişiyor, ya da bölgesel farklılıklar var. Bu durumda, bu vzn'nin deyimsel tarzıdır.
Yuval Filmus

-3

Hayır, çoğunlukla uzay karmaşıklığını düşünürken! Normal bir bilgisayarın depolama kapasitesi katlanarak artıyor.


Tersi doğru olmaz mıydı - 'sonsuz' depolama alanınız varsa, alan karmaşıklığı konusunda uğraşmanıza gerek kalmazdı. 'Sorun', depolamanın büyümesi değil, üzerinde çalışacak verilerin, işlemsel gücün ve hafızanın artmasıyla sunulan hızları doldurmada senkronize olarak artmasıdır - ki bu iyi bir şey, kozmosu daha gerçekçi modellemek, daha fazla protein katlamak vb. (PS. Aşağı oy
vermedim

4
Pek çok mobil uygulama geliştiricisinin sonsuz kaynakları olduğu varsayılıyor , ancak maalesef cihazım çok sınırlı.
Raphael
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.