“Genel gider” nedir?


150

Bilgisayar Bilimi öğrencisiyim ve programlar ve türler söz konusu olduğunda "tepegöz" kelimesini çok duyuyorum. Bu tam olarak ne anlama geliyor?


27
bir şey elde etmek için ne kadar "ekstra şeyler" yapmanız gerekir. Örneğin, sadece "Merhaba Dünya" yı yazdırmak için 37 derslik bir proje yüklemem gerekirse, bu yükü bir hayli düşünürdüm.
scunliffe

1
@ doug65536 Aslında tam tersi. =)
Yukio Fukuzawa

Yanıtlar:


178

Bir işlem kurmak için gereken kaynaklardır. İlgisiz görünebilir, ancak gerekli olabilir.

Bir yere gitmeniz gerektiğinde, bir arabaya ihtiyacınız olabilir. Ancak, caddeden aşağı araba sürmek için çok fazla yük olurdu, bu yüzden yürümek isteyebilirsiniz. Ancak, ülke genelinde gidiyor olsaydı yükü buna değer olurdu.

Bilgisayar bilimlerinde bazen arabaları caddeden aşağı inmek için kullanırız çünkü daha iyi bir yolumuz yoktur ya da “nasıl yürümeyi öğreneceğimize” değmez.


84
Benzer bir benzetme uçuyor olurdu. Uçaklar arabalardan çok daha hızlıdır, ancak havaalanı check-in, güvenlik vb. Genel giderleri, arabaları daha kısa mesafeler için daha iyi bir seçenek haline getirir.
FogleBird

Eğer gerek ediyorsanız s / sürücü / (/ go sürücü yerde ... genellikle yürümeye karar yok
RCIX

1
@ inf3rno İronik mi? Arabamıza nasıl ulaşabiliriz? Yürüyoruz. Ve tamamen yürüyebiliyoruz ... arabamıza. Arabamızdan daha yakın olsa bile hedefimize yürüyemiyoruz.
corsiKa

Düşük havai java kodu yazdığımı söyleseydim, bunu "bir işlem kurmak için gerekli kaynaklar" tanımı açısından nasıl yorumlardınız. Kodum fazla kurulum gerektirmiyor mu?
committedandroider

Bilgisayarı veya sunucuyu açmanız gerekiyor, işletim sistemini ve tüm sürücüleri yüklemelisiniz, Java işlemini başlatmanız gerekiyor, JVM'yi açmanız gerekiyor, tüm sınıflarınızı yüklemelisiniz, "merhaba dünya" yapabilmeniz için IO tamponunu konsola senkronize etmeniz gerekiyor. Ama lütfen bana düşük genel kodlama hakkında daha fazla bilgi verin.
corsiKa

40

Kelimenin anlamı bağlamla çok farklı olabilir. Genel olarak, amaçlanan sonuca doğrudan katkıda bulunmayan, ancak kullanılan teknoloji veya yöntem için gerekli olan kaynaklar (çoğunlukla bellek ve CPU zamanı) kullanılır. Örnekler:

  • Protokol yükü : Ethernet çerçeveleri, IP paketleri ve TCP segmentlerinin hepsinin başlığı vardır, TCP bağlantıları el sıkışma paketleri gerektirir. Böylece, donanımın sağlayabileceği tüm bant genişliğini gerçek verileriniz için kullanamazsınız. Daha büyük paket boyutları kullanarak ek yükü azaltabilirsiniz ve UDP'nin daha küçük bir başlığı vardır ve el sıkışma olmaz.
  • Veri yapısı bellek ek yükü : Bağlı liste, içerdiği her eleman için en az bir işaretçi gerektirir. Öğeler bir işaretçi ile aynı boyuttaysa, bu,% 50 bellek yükü anlamına gelirken, bir dizinin potansiyel olarak% 0 ek yükü olabilir.
  • Yöntem çağrısı yükü : İyi tasarlanmış bir program birçok kısa yönteme bölünmüştür. Ancak her yöntem çağrısı, bir yığın çerçeve kurmayı, parametreleri kopyalamayı ve bir dönüş adresini gerektirir. Bu, her şeyi tek bir yekpare işlevde yapan bir programa kıyasla CPU ek yükünü temsil eder. Tabii ki, eklenen sürdürülebilirlik buna çok değer veriyor, ancak bazı durumlarda aşırı yöntem çağrıları önemli bir performans etkisine sahip olabilir.

Kelimenin tüm bu örneklerde aynı anlamı var gibi görünüyor (görevi yerine getirmek için gerekli, ancak her zaman doğrudan yapmakla ilgili değil)
RCIX

Veri yapısı bellek ek yükü: Çoğu bellek ayırıcıda, bundan daha da kötüdür. Döndürülen her bir değerin malloc, blok boyutu artı koruma değerlerinden oluşan ayırıcı (klasik 32 bit makine olduğu varsayılır) nedeniyle 8 baytlık yerleşik bir yükü vardır. Ve bu, tahsis ayrıntı düzeyini bile düşünmeden önce. Tek bir bağlantılı basit 4 bayt tam sayı listesi bu nedenle% 75'lik bir ek yüke sahip olacaktır; diziler çok daha iyidir (ortada hızlı yerleştirme gerekmedikçe), ek yükü bir kez (veya dizi dinamik olarak tahsis edilmemişse) daha az olabilirler.
Donal Fellows

19

Yorgunsun ve daha fazla iş yapamazsın. Sen yemek yersin. Yiyecek aramak, almak ve aslında yemek yemek için harcanan enerji, enerji tüketir ve havai olur!

Genel gider, bir görevi yerine getirmek için boşa giden bir şeydir. Amaç, yükü çok küçük yapmaktır.

Bilgisayar bilimlerinde bir sayı yazdırmak istediğinizi varsayalım, bu sizin göreviniz. Ancak sayıyı saklamak, ekranı yazdırmak için ayarlamak ve yazdırmak için rutinleri çağırmak, sonra değişkenten sayıya erişmek tamamen ek yüktür.


17

Vikipedi bizi ele aldı :

Bilgisayar bilimlerinde genel gider , genellikle belirli bir hedefe ulaşmak için gereken fazla veya dolaylı hesaplama süresi, bellek, bant genişliği veya diğer kaynakların herhangi bir kombinasyonu olarak kabul edilir. Özel bir mühendislik yükü durumudur.


4
Ama eğer olmadıysa, WikiPedia'yı düzeltir ve aynı mesajı burada yaparsınız.
SamGoody

11

Genel gider genellikle farklı programlama algoritmalarının kullandığı fazladan kaynak miktarını (bellek, işlemci, zaman vb.) Belirtir.

Örneğin, dengeli bir İkili Ağaca ekleme yükü, basit bir Bağlantılı Listeye aynı kesici uçtan çok daha büyük olabilir (kesici uç daha uzun sürer, Ağacı dengelemek için daha fazla işlem gücü kullanır, bu da daha uzun süre algılanan çalışma süresine neden olur. Kullanıcı).


5

Bir programcı yükü, belirli bir girdi verisi kümesi üzerinde bir platformda çalışırken kodunuz tarafından tüketilen sistem kaynaklarını ifade eder. Genellikle terim, farklı uygulamaları veya olası uygulamaları karşılaştırma bağlamında kullanılır.

Örneğin, belirli bir yaklaşımın ciddi CPU yükü oluşturabileceğini söyleyebiliriz, bir başkası daha fazla bellek yüküne neden olabilir ve yine de bir başkası ağ yüküne ağırlık verebilir (ve örneğin harici bir bağımlılık gerektirebilir).

Belirli bir örnek verelim: Bir sayı kümesinin ortalamasını (aritmetik ortalama) hesaplayın.

Bariz yaklaşım, toplamı ve sayıyı koruyarak girişler üzerinde döngü yapmaktır. Son sayı ile karşılaşıldığında ("dosya sonu" EOF veya bazı sentinel değeri veya bazı GUI düğmeleriyle sinyal verilir), toplamı girdi sayısına böleriz ve işimiz biter.

Bu yaklaşım CPU, bellek veya diğer kaynaklar açısından neredeyse hiç yük oluşturmaz. (Bu önemsiz bir görev).

Başka bir olası yaklaşım, girdiyi bir listeye "kaydırmak" tır. toplamı hesaplamak için liste üzerinde tekrarlayın, ardından listeden geçerli öğe sayısına bölün.

Karşılaştırıldığında, bu yaklaşım keyfi bellek yüküne neden olabilir.

Belirli bir kötü uygulamada, toplama işlemini özyineleme kullanarak ancak kuyruk eliminasyonu olmadan gerçekleştirebiliriz. Şimdi, listemiz için bellek ek yüküne ek olarak, yığın ek yükü de sunuyoruz (bu, farklı bir bellek türüdür ve genellikle diğer bellek türlerinden daha sınırlı bir kaynaktır).

Yine başka bir (tartışmasız daha saçma) yaklaşım, tüm girdileri bir RDBMS'deki bazı SQL tablolarına göndermek olacaktır. Sonra bu tablonun sütununda SQL TOPLA işlevini çağırmanız yeterlidir. Bu, yerel bellek ek yükümüzü başka bir sunucuya kaydırır ve yürütme ağ yükü ve harici bağımlılıklara neden olur. (Uzak sunucunun bu görevle ilişkili belirli bir bellek ek yükü olabileceğini veya olmayabileceğini unutmayın. Örneğin, tüm değerleri hemen depoya atabilir).

Varsayımsal olarak bir tür küme üzerinde bir uygulamayı düşünebilir (muhtemelen trilyonlarca değerin ortalamasını mümkün kılar). Bu durumda, değerlerin gerekli kodlanması ve dağıtımı (düğümlerle eşleştirilmesi) ve sonuçların toplanması / harmanlanması (azaltma) ek yük olarak sayılır.

Programcının kendi kodunun ötesindeki faktörlerin neden olduğu ek yük hakkında da konuşabiliriz. Örneğin, 32 veya 64 bit işlemciler için bazı kodların derlenmesi, eski 8 bit veya 16 bit mimari için göreceğinden daha fazla ek yük gerektirebilir. Bu, daha büyük bellek ek yükü (hizalama sorunları) veya CPU ek yükü (CPU'nun bit sırasını ayarlamak zorunda kaldığı veya hizalanmamış talimatlar vb.) Veya her ikisini içerebilir.

Kodunuz ve kütüphaneleri vb. Tarafından kullanılan disk alanına genellikle "tepegöz", daha çok "kapladığı alan" denir. Ayrıca programınızın kullandığı temel belleğe (işlediği veri kümesine bakılmaksızın) "kapladığı alan" da denir.


3

Genel gider, programın yürütülmesinde daha fazla zaman harcanmasıdır. Misal ; bir fonksiyonu çağırdığımızda ve onun kontrolü tanımlandığı yerden geçtiğinde ve daha sonra gövdesi yürütüldüğünde, CPU'muzun uzun bir süreçten geçmesini sağlıyoruz (önce kontrolü hafızadaki başka bir yere geçirip sonra orada çalıştırıyoruz ve sonra kontrolün eski konumuna geri döndürülmesi), sonuç olarak çok fazla performans süresi, dolayısıyla Tepegöz alır. Hedeflerimiz, işlev tanımlaması ve işlev çağrısı sırasında satır içi işlevini kullanarak bu ek yükü azaltmaktır; bu işlev, işlev çağrısında işlevin içeriğini kopyalar, bu nedenle kontrolü başka bir konuma geçirmiyoruz, ancak programımızı bir satırda sürdürüyoruz, dolayısıyla satır içi .


2

Bir sözlük kullanabilirsiniz. Tanım aynıdır. Ancak size zaman kazandırmak için, Tepegöz üretken işi yapmak için gereken iştir. Örneğin, bir algoritma çalışır ve yararlı bir iş yapar, ancak işini yapmak için bellek gerektirir. Bu bellek ayırma işlemi zaman alır ve yapılan işle doğrudan ilişkili değildir, bu nedenle ek yüktür.


1

Wikipedia'yı kontrol edebilirsiniz . Ancak esas olarak daha fazla eylem veya kaynak kullanıldığında. .NET'e aşinaysanız, değer türlerine ve referans türlerine sahip olabilirsiniz. Referans türlerinde, değer türlerinden daha fazla bellek gerektiğinden bellek ek yükü bulunur.


1

Genel giderlerin somut bir örneği, "yerel" prosedür çağrısı ile "uzak" prosedür çağrısı arasındaki farktır.

Örneğin, klasik RPC (ve EJB gibi diğer birçok uzak çerçeve) ile, bir işlev veya yöntem çağrısı, ister yerel, ister bellek çağrısında, ister dağıtılmış bir ağ çağrısında olsun, bir kodlayıcıyla aynı görünür.

Örneğin:

service.function(param1, param2);

Bu normal bir yöntem mi yoksa uzak bir yöntem mi? Burada gördüğünüz şeyden anlatamazsınız.

Ancak, iki çağrı arasındaki yürütme sürelerindeki farkın dramatik olduğunu hayal edebilirsiniz.

Dolayısıyla, çekirdek uygulama "aynı maliyete" sahip olsa da, ilgili "genel gider" oldukça farklıdır.


1

Ek yükü, iş parçacıklarını yönetmek ve aralarında koordinasyon sağlamak için gereken zaman olarak düşünün. İş parçacığının yapacak yeterli görevi yoksa bu bir yüktür. Böyle bir durumda genel maliyet, iş parçacığı kullanılarak kaydedilen zaman gelir ve kod sıralı olandan daha fazla zaman alır.


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.