Programlamada bellek yönetimi alakasız bir mesele haline mi geliyor?


38

Geçmiş
Alioth Language Shootout ( http://benchmarksgame.alioth.debian.org/ ) , eskiden beri bulunmadığım eski (ama harika) bir siteyi tekrar ziyaret ettim .

Birkaç yıl önce C / C ++ 'da programlama yapmaya başladım, ancak o zamandan beri Java'da sadece dahil olduğum projelerdeki dil kısıtlamaları nedeniyle çalışıyordum. Rakamları hatırlamadığımdan, Java'nın ne kadar iyi olduğunu görmek istedim. kaynak kullanımı açısından C / C ++ 'a karşı yöneldi.

Yürütme süreleri yavaş C / C ++ den 4 katına performans en kötü Java ile, hala nispeten iyi, ama ortalama civarını (veya altında) 2x. Java'nın uygulamasının doğası gereği, bu sürpriz olmadı ve performans süresi aslında beklediğimden daha düşüktü.

Gerçek tuğla bellek tahsisiydi - en kötüsü Java tahsis edildi:

  • C’den 52 kat daha fazla hafıza
  • ve C ++ 'dan 25 kat daha fazla.

52x bellek ... Kesinlikle kötü, değil mi? ... yoksa öyle mi? Bellek şimdi nispeten ucuz.

Soru:
Çalışma hafızasında (örn. Gömülü sistemler ve benzeri) katı sınırlara sahip hedef platformlar açısından konuşmazsak, bugün genel amaçlı bir dil seçerken bellek kullanımı bir endişe oluşturmalı mı?

Kısmen soruyorum çünkü Scala'ya göç etmeyi ana dilim olarak görüyorum. İşlevsel yönlerini çok seviyorum, ancak gördüğümden beri bellek açısından Java'dan bile daha pahalı. Ancak, hafızanın yıllara göre daha hızlı, daha ucuz ve daha bol olduğu görülüyor (en az 4GB DDR3 RAM olmadan tüketici dizüstü bilgisayarı bulmak gittikçe zorlaşıyor gibi görünüyor), kaynak yönetiminin giderek daha fazla hale geldiği iddia edilemezdi. daha okunaklı çözümlerin daha hızlı oluşturulmasını sağlayan (muhtemelen uygulama açısından pahalı) yüksek seviyeli dil özellikleri ile karşılaştırıldığında alakasız mı?


32
Java'nın küçük bir kıyaslama ölçütü için C'den 52 kat daha fazla bellek ayırması nedeniyle, büyük bir uygulama için 52 kat daha fazla bellek kullanacağı anlamına gelmez. Aslanın o hatıradaki payı JVM tarafından istenen sabit bir miktar olacaktır ve uygulamanız ne kadar büyük olursa, o kısım o kadar az belirginleşir.
Carson63000

4
Mobil gelişim alakasız ise, evet.
JeffO

3
Soru, Java benchmarkının C / C ++ ile ne kadar kötü olduğu ve iki dil arasında seçim yapmanın ne anlama geldiğidir. Bunu konuyla ilgili, tüm programcılarla ilgili, net, odaklanmış ve mevcut haliyle makul bir şekilde cevaplanabildiğini görüyorum. Yeniden açılmaya oy verdim.
GlenPeterson

Çoğu performans problemi, araç seviyesinde değil tasarım düzeyinde ortaya çıkar ve çözülür. Bazı problemler 1ms granülerliğe ihtiyaç duyar ve bu nedenle C / C ++ gerektirir. Eğer 10ms gibi boş yeriniz varsa, belki Scala veya Java iyi bir seçenektir. Oyunlar için çoğu giriş denetleyicisi 50-100 ms düzeyinde çalışır. Günümüzde pek çok kişi bir dilde kritik bölümler, bir diğerinde ise programın geri kalanını yazar.
GlenPeterson

4
Bu testte "25x fazla C ++ 'a bakıldığında, çalışma zamanının sürekli eklendiğini (yaklaşık 13 Mb) hesaba katmanız gerekir. Sorun büyüdükçe, çalışma zamanı belleği gereksinimi tüm programın yüzdesi olarak azalır. C ++ bellek kullanımı 1 MB'tan küçük olduğunda, C ++ bellek kullanımını Java Bellek kullanımından çıkarırsanız, oldukça sabit bir değer elde edersiniz.

Yanıtlar:


34

Hafıza yönetimi tamamen önemlidir çünkü bir hafızada çok fazla hafıza olsa bile bir şeyin ne kadar hızlı göründüğünü düzenler. En iyi ve en kanonik örnek, Call of Duty veya Bioshock gibi AAA başlıklı oyunlar. Bunlar, optimizasyon ve kullanım açısından büyük miktarda kontrol gerektiren etkili bir şekilde gerçek zamanlı uygulamalardır. Sorun tek başına kullanım değil, yönetimdir.

İki kelimeye iniyor: Çöp Toplama. Çöp Toplama algoritmaları performansta hafif hıçkırıklara neden olabilir veya uygulamanın bir veya iki saniye beklemesine neden olabilir. Bir muhasebe uygulamasında çoğunlukla zararsızdır ancak Call of Duty oyununda kullanıcı deneyimi açısından potansiyel olarak yıkıcıdır. Bu nedenle zamanın önemli olduğu uygulamalarda, çöp toplanan diller son derece problemli olabilir. Örneğin, Lua’nın GC’si ile olan sorunu, bunun yerine referans sayımını kullanarak çözmeyi hedefleyen Squirrel’in tasarım amaçlarından biri.

Daha çok baş ağrısı mı oluyor? Tabii ama hassas bir kontrole ihtiyaç duyarsanız, buna katlanırsınız.


14
-1 "... kelimenin tam anlamıyla bir oyunda öldürücüdür ..." - Gündelik işim, yaşam güvenliğinde olduğu gibi güvenlik açısından kritik bir sistemdir. Oyun yazılımında en kötüsü yazar büstür, çünkü berbat ve kimse satın almaz. Bu önemsizleştirilmemesi gereken bir farktır.
mattnz

4
@ Mattnz Benim açımdan kötü kelime seçimi. Düzeltildi. Hiçbir şeyi önemsizleştirmek niyetim değildi.
Dünya Mühendisi

19
@Mattnz: Eğer oyunlara aşina iseniz, o açıkça sizin karakteriniz için öldürücü olabileceği anlamına gelir, bu tamamen doğru bir ifadedir.
Mason Wheeler,

8
+1, çünkü cevaplayıcının elması bir elmas olduğundan cevap doğru olmalı.
psr

8
Gerçek zamanlı çöp toplayıcıları uzun zamandır var.
Jörg W Mittag

30

Gerçek tuğla bellek tahsisi oldu - en kötüsü, Java C'den 52 kat daha fazla, C ++ 'dan 25 kat daha fazla bellek ayırdı.

Sorunuza dayandırdığınız sayıları anlıyor musunuz ?

  • Ne kadar hafıza ayrıldı?
  • Programlar ne yapıyordu?

Bu Java ve C programları arasında büyük bir eşitsizlik olduğunda, çoğunlukla libc'nin ihtiyaç duyduğu şeylere karşı varsayılan JVM bellek tahsisidir:

  • n-body
    Java programı 13.996KB :: C programı 320KB :: Ücretsiz Pascal 8KB

Atanacak bellek gerektiren görevlere bakın (veya çok çekirdekli programlardan sonuç toplamak için ek arabellek kullanın):

  • mandelbrot
    Java programı 67 , 880KB :: C programı 30 , 444KB

  • k-nükleotid
    Java programı 494 , 040KB :: C programı 153 , 452KB

  • ters tamamlayıcı
    Java programı 511 , 484KB :: C programı 248 , 632KB

  • regex-dna
    Java programı 557 , 080KB :: C programı 289 , 088KB

  • ikili ağaçlar
    Java programı 506 , 592KB :: C programı 99 , 448KB

... bugün genel amaçlı bir dil seçerken bellek kullanımı kaygı verici mi?

Bu ister bağlıdır belirli kullanımı, sizin için belirli çözme yaklaşımı belirli size çözmek için gereken sorunları, kısıtlanacağı ve belirli kullanılabilir bellek sınırları belirli kullanılacak platforma.


3
Rakamları kazma konusundaki düşünceniz geçerlidir ve bu sitenin testlerini çevreleyen kesinlikle bir kaçınılmazlığı vardır. Cevabınız doğrudan ana soruyu ele alarak güçlendirilecektir, “bellek kullanımı bir endişe mi olmalı?”.

1
Göreceli olarak kötü bir sorunun kurtarıldığı yönündeki mükemmel cevap (belli belirsiz ölçütler erken optimizasyondan bile daha kötüdür :). Analizi destekleyen veriler iyi bir şekilde sunulmuştur, somuttur ve düşünce için harika bir yemek yapar. Kesinlikle "örnek bir cevap" ödülüne değdi .
tatarcık

17

Her şeyde olduğu gibi, bir takas.

Tek bir kullanıcı masaüstünde çalışacak ve bu makinede RAM'in büyük bir kısmını kontrol etmesi makul olarak beklenebilecek bir uygulama oluşturuyorsanız, uygulama hızı için bellek kullanımını feda etmeye değebilir. Aynı makineyi hedefliyorsanız, ancak aynı anda çalışmakta olan diğer bir grup açlıkla açılmış uygulama ile rekabet edecek küçük bir yardımcı program oluşturuyorsanız, bu takas konusunda daha temkinli olmak isteyebilirsiniz. Bir kullanıcı çalışırken tüm hafızasını isteyen bir oyunda iyi olabilir (yine de, World Engineer'ın işaret ettiği gibi). Çöp toplayıcı, hareketi düzenli aralıklarla bir süpürme işlemi yapmak için duraklatmaya karar verirse endişelenirsiniz) - başka şeyler yaparken arka planda çalıştırdıkları müzik çalar, tonlarca bellek çalmaya karar verirse daha az heyecanlanırlar ve çalışma yeteneklerini engeller. Web tabanlı bir uygulama oluşturuyorsanız, sunucularda kullandığınız herhangi bir bellek, aynı kullanıcı grubunu desteklemek için sizi daha fazla uygulama sunucusuna daha fazla para harcamaya zorlama yeteneğinizi sınırlandırır. Bunun şirketin ekonomisi üzerinde büyük bir etkisi olabilir, bu yüzden bu takası yapma konusunda çok dikkatli olmak isteyebilirsiniz. Sunucularda kullandığınız herhangi bir bellek, aynı kullanıcı grubunu desteklemek için sizi daha fazla uygulama sunucusuna daha fazla para harcamak zorunda bırakma yeteneğinizi sınırlar. Bunun şirketin ekonomisi üzerinde büyük bir etkisi olabilir, bu yüzden bu takası yapma konusunda çok dikkatli olmak isteyebilirsiniz. Sunucularda kullandığınız herhangi bir bellek, aynı kullanıcı grubunu desteklemek için sizi daha fazla uygulama sunucusuna daha fazla para harcamak zorunda bırakma yeteneğinizi sınırlar. Bunun şirketin ekonomisi üzerinde büyük bir etkisi olabilir, bu yüzden bu takası yapma konusunda çok dikkatli olmak isteyebilirsiniz.


8

Bu, bir dizi faktöre, özellikle de çalıştığınız ölçeğe bağlıdır.

Sadece tartışma uğruna, bellekte 30x, CPU kullanımında 2x farz edelim.

C ile yazılmışsa 10 megabayt bellek ve 1 milisaniye CPU alacak etkileşimli bir programla uğraşıyorsanız, bu oldukça önemsizdir - 300 megabayt bellek ve yürütmek için 2 milisaniye normalde tamamen normal bir masaüstünde anlamsızdır, ve hatta bir telefonda veya tablette bile çok anlama gelme olasılığı düşük.

1 sunucunun kaynaklarının yaklaşık yarısına ihtiyaç duymakla 15 sunucuya ihtiyaç duymak arasındaki fark çok daha büyük bir adım olsa da - özellikle 15 sunucuya ölçeklendirmek , daha az yerine daha fazla geliştirme için fazladan çalışma gerektirebilir . Gelecekteki genişleme söz konusu olduğunda, bahsettiğiniz aynı etkenler, müşteri tabanınız büyük bir gelişme göstermediği sürece , şu anda bir sunucuda çalışacaksa, olasılıkla o sunucuyu geride bıraktığınızda, muhtemelen iyi olacağını Bunu daha yeni bir sunucu ile sorunsuzca değiştirebiliyoruz.

Gerçekten göz önünde bulundurmanız gereken diğer faktör, özel göreviniz için geliştirme maliyetinde ne kadar fark göreceğinizdir. Şu anda, temel olarak bir denklemin bir tarafına bakıyorsunuz. Maliyetler ve faydalar hakkında iyi bir fikir edinmek için, (yeterince açıkçası) yalnızca izolasyonda değil, hem maliyetlere hem de faydalara bakmanız gerekir. Asıl soru temel olarak: "x, y'den büyük mü?" - ama bunu yalnızca x'e bakarak belirleyemezsin. Y'ye de açıkça bakmanız gerekir.


2
Ölçek belirtmek için +1. Büyük ölçüde gerçekten uygun kaynak yönetimi için bu makaleye bir göz atın .
Guy Coder

6

Hafıza yönetimi bugünün dünyasında kesinlikle önemlidir. Ancak, beklediğiniz şekilde değil. Çöp toplayan dillerde bile referans sızıntısı olmadığından emin olmalısınız

Eğer kodunuz buysa yanlış bir şey yapıyorsunuz:

static List<string> Cache;

...
Cache.Add(foo); //and then never remove anything from Cache

Çöp toplama işlemi sihirli bir şekilde, bir daha hiçbir referans kullanmayacağınızı asla bilemez. edemez yaparak, yine yani kullanmak Cache=nulletkili hey edebilmek için gitmiyorum" diye çöp toplayıcısı uyarmak, Artık erişebilirsin. Bununla ne istersen yap "

Bundan daha karmaşık, ancak referans kaçakları, geleneksel hafıza sızıntılarından daha fazla zararlı değilse de aynı.

Çöp toplayıcıya sığamayacağınız yerler de var. Örneğin, ATTiny84, 512 bayt ROM kodu ve 32 bayt RAM içeren bir mikrodenetleyicidir. İyi şanslar! Bu aşırı bir şey ve muhtemelen montajdan başka bir şeyde programlanmayacaktı, ama yine de. Diğer durumlarda 1M belleğiniz olabilir. Tabii, o zaman çok pahalı izleme nedir neden bir çöp toplayıcısı kullanmak istediğiniz etmeyeceğiz, bir çöp toplayıcısı sığabilir ama işlemci çok yavaş ise (sınırlamalar yoluyla veya pili korumak için) ne programcı olabilir biliyorum .

Ayrıca, garanti edilen yanıt sürelerine ihtiyaç duyduğunuzda çöp toplama işlemini kullanmak çok daha zorlaşır. Mesela, kalp monitörünüz veya başka bir şey varsa ve bir1 bağlantı noktasını , ona 10ms içinde uygun bir sinyal ya da bir şeyle cevap verebileceğinizi garanti etmeniz gerekir. Yanıt rutininizin ortasında, çöp toplayıcısının bir pas atması gerekiyor ve yanıt vermesi 100ms alıyorsa, bu biri ölmüş olabilir. Çöp toplama işlemi, zamanlama şartlarının garanti edilmesi gerektiğinde kullanılması imkansız olmasa da çok zordur.

Ve elbette, modern donanımda bile, bir çöp toplayıcısının yükü için endişelenmeyerek performansın% 2'sine ihtiyaç duyduğunuz bazı durumlar vardır.


3

Donald Knuth'un dediği gibi, erken optimizasyon tüm kötülüklerin kökenidir. Hafızanın tıkanıklık olacağına inanmak için bir nedeniniz yoksa, endişelenmeyin. Ve Moore yasasının hala arttırılmış bellek kapasitesi sağladığı göz önüne alındığında (tek iş parçacıklı kodlardan daha hızlı çıkmamamıza rağmen), gelecekte bellekte bizden daha az kısıtlanacağımıza inanmak için her neden var. bugün

Eğer optimizasyon erken değilse, elbette bunu yapın. Kişisel olarak şu anda bellek kullanımımı ayrıntılı olarak anladığım bir proje üzerinde çalışıyorum, gerçekten hassas bir kontrole ihtiyacım var ve bir çöp taraması beni öldürür. Bu nedenle bu projeyi C ++ 'da yapıyorum. Ancak bu seçim benim için birkaç yılda bir gerçekleşecek gibi görünüyor. (Umarım birkaç hafta içinde birkaç yıl daha C ++ 'a dokunmayacağım.)


4
Bu tutum, sayfalamaya devam eden inanılmaz derecede yavaş bilgisayarlardaki şişirilmiş kurumsal yazılımlarla nasıl sonuçlanacağımızdır. Herkes, 'Uygulamamın daha fazla hafıza gerektirdiğinden emin, ancak kimin umrunda, pratik olarak ücretsiz!' Der. ve sonra 4GB RAM makinesini 10 yıl önce 512 MB RAM makinesinden daha yavaş çalışmasını sağlayan tam bir bellekle açılmış uygulamalar yığınıyla bitirdiniz.
MrFox

@MrFox Aslında işletme yazılımıyla ilgili sorun, onu kullanmaya karar verenlerin, onunla acı çeken insanlar olmamasıdır. Neden kırıldığına dair mükemmel bir açıklama için lists.canonical.org/pipermail/kragen-tol/2005-April/000772.html adresine bakın . Gerisi gelince, bellek kullanımı konusunda endişelenmenin bazen gerekli olduğunu belirtmemi özlediniz mi?
Btilly

3

"Büyük veri" ile ilgilenen insanlar için hafıza yönetimi hala büyük bir konudur. Astronomi, fizik, biyoinformatik, makine öğrenimi vb. Programların hepsi çoklu gigabayt veri setleriyle uğraşmak zorundadır ve ilgili bölümlerin bellekte tutulması durumunda programlar çok daha hızlı çalışır. 128 GB RAM'e sahip bir makinede çalışmak bile sorunu çözmüyor.

Ayrıca GPU’dan yararlanma meselesi de var, belki de bunu gömülü bir sistem olarak sınıflandırmanız gerekir. CUDA veya OpenCL'i kullanma konusundaki zor düşüncelerin çoğu, verileri ana bellekten GPU belleğine aktarmada bellek yönetimi sorunlarına neden olur.


1

Adil olmak gerekirse, pek çok Java, sadece performans öldüren ve hafızayı canlandıran bazı gerçek ve anlamsız sınıf patlayıcı kalıplara düşkündür, ancak bu hafızanın ne kadarının sadece teoride (hh) çalıştıracağınız JVM olduğunu merak ediyorum. tamamen yenilerini yeniden yazmak zorunda kalmadan birden fazla ortamda aynı uygulamayı. Bu nedenle tasarım tradeoff sorusu her şeyden kaynaklanıyor: "Kullanıcı hafızanızın ne kadarı sizin için bir gelişme avantajı?"

Bu, IMO'nun dikkate alması gereken kusursuz ve makul bir takas. Yine de beni kızdıran şey, modern PC'lerin çok güçlü ve hafızanın ucuz olması nedeniyle, bu kaygıları ve şişirme özelliklerini ve şişirme kodunu tamamen görmezden gelebileceğimiz ve birçok şey gibi göründüğü noktadaki seçimler konusunda tembel olabileceğimiz düşüncesi. Şimdi bir windows PC'de yapıyorum, Windows 95'te olduğu gibi sürüyor. Cidden olsa da, Word? Kullanıcı tabanlarının% 80'inin gerçekten ihtiyacı olan ne kadar yeni saçmalık, 18 yılda ekleyebilecekleri olabilir? Ön pencereleri yazım denetimi yaptığımızdan emin misiniz? Ama biz bol bol varsa ben de dalmak için mutlaka hız olması gereken bir hafızadan söz ediyorduk.

Fakat tabii ki, uygulamanın 2 hafta yerine sadece birkaç K versiyonuna ihtiyaç duyması için 2 yıl yerine belki birkaç ekstra megabayt maliyetine ulaşması durumunda, birkaç kullanıcının nasıl karşılaştığını düşünmeye değer. Tahmin ediyorum) Ortalama bir kullanıcı makinesinde 4-12 gösterici bu kadar özensiz olma fikrine kapılmadan önce.

Fakat bunun Scala ile tradeoff sorununun ötesinde ne ilgisi var? Sırf çöp toplaması olduğu için, kapsamlar ve kapanışlar açısından ne olduğu hakkında veri akışını düşünmeye çalışmamanız gerektiği ve çevresinde kalacak şekilde bırakılmaması veya kullanılıp kullanılmayacağı anlamına gelmez. Artık ihtiyaç duyulmadığında GC tarafından ayrılır. Bu bizim bile bir şey değil JavaScript UI web geliştiricileri hakkında düşünmek zorunda kaldık ve umarım devam eden meraklı kanser gibi diğer sorun alanlarına yayıldıkça devam edeceğiz (hepiniz Flash veya Applet'lerle ya da şansınız varken bir şeyleri öldürmüş olmalısınız). biz.


0

Programlamada bellek yönetimi alakasız bir mesele haline mi geliyor?

Bellek yönetimi (veya kontrolü) aslında C ve C ++ kullanmamın ana nedeni.

Bellek şimdi nispeten ucuz.

Hızlı hafıza değil. Halen i7'deki L1 için 32KB, L2 için 256KB ve L3 / core için 2MB gibi bir miktar veri kaydına bakıyoruz. Bahsedilen:

Eğer çalışma hafızasında (yani gömülü sistemler ve benzeri) katı sınırlara sahip hedef platformlar açısından konuşmazsak, bugün genel amaçlı bir dil seçerken bellek kullanımı kaygı verici mi olmalı?

Genel seviyede hafıza kullanımı, belki de değil. Biraz pratik değil, çünkü 50 megabayt DRAM ve yüzlerce megabayt sabit disk alanı kaplayan bir not defteri fikrinden hoşlanmıyorum. Uzun zamandır buralardayım ve bu kadar basit bir uygulamanın kilobayt ile ne yapılması gerektiğine dair oldukça fazla bellek harcadığını görmek bana biraz tuhaf geliyor. Bununla birlikte, eğer hala iyi ve duyarlı olsaydı, böyle bir şeyle karşılaştıysam kendimle yaşayabileceğimi söyledi.

Alanımda bellek yönetiminin benim için önemli olmasının nedeni, bellek kullanımını genel olarak çok fazla azaltmak değil. Yüzlerce megabayt bellek kullanımı, bu belleğe sık sık erişilmiyorsa, bir uygulamayı önemsiz olmayan bir şekilde yavaşlatmayacaktır (örneğin: yalnızca bir düğmeyi tıklattığınızda veya başka bir kullanıcı girişi biçiminde, bu durum sizler oldukça seyrek görülür) Saniyede milyon kere bir düğmeye basabilecek Koreli Starcraft oyuncularından bahsediyoruz).

Alanımda önemli olmasının nedeni , bu kritik yollarda çok sık erişilen (örneğin: her kareye ilmekli) belleğin sıkı ve birbirine yakın hale gelmesidir. Her karede bir döngüde erişilmesi gereken milyon öğeden sadece birine eriştiğimizde, önbellek kaçırmak istemiyoruz. 64 parça bayt önbellek satırını, büyük parçalarda hafızayı yavaş bellekten hızlı belleğe taşıdığımızda, 64 bayt önbellek satırları söz konusu olduğunda, bu 64 baytın hepsinde alakalı veriler içeriyorsa, bu 64 bayta veri değerinde birden fazla öğeye sığabilirsek ve Erişim kalıplarımız, veriler çıkarılmadan önce hepsini kullanırız.

Milyonlarca element için sıkça erişilen veriler, gigabaytlarımız olmasına rağmen sadece 20 megabaytlık bir alanı kapsayabilir. Hafıza, önbellek kayıplarını en aza indirmek için birbirine yakın ve yakın olması durumunda çizilen her bir karede, bu veriler üzerinden geçen kare hızlarında bir fark yaratıyor. Birkaç milyon köşeli bir alanda basit görsel örnek:

görüntü tanımını buraya girin

Yukarıdakiler aslında benim değişken sürümümden daha yavaştır, çünkü bir ağın kalıcı bir veri yapısı gösterimini test eder, ancak bir yana, bu verilerin yarısında bile bu kare hızlarını elde etmek için mücadele ederdim (kuşkusuz donanım mücadelelerimden bu yana daha hızlı oldu. ) çünkü önbellek eksikliklerini ve ağ verileri için bellek kullanımını en aza indirmeyi alamadım. Ağlar, bu konuda ele aldığım en zorlu veri yapılarından bazılarıdır, çünkü çokgenler, kenarlar, köşeler, kullanıcının eklemek istediği kadar doku haritası, kemik ağırlıkları gibi senkronize kalmak zorunda olan çok fazla bağımlı veri depolarlar. renk haritaları, seçim setleri, morph hedefleri, kenar ağırlıkları, poligon malzemeleri vb.

Geçtiğimiz birkaç on yılda bir dizi ağ sistemi tasarladım ve uyguladım ve hızları hafıza kullanımları ile çok orantılıydı. Çalıştığımdan çok daha fazla bellek ile çalışsam da, yeni örgü sistemlerim ilk tasarımımdan (neredeyse 20 yıl önce) 10 kat daha hızlı ve büyük ölçüde de 10 / 10'u kullanıyor çünkü Hafıza En yeni sürüm mümkün olduğu kadar çok veriyi toplamak için endekslenmiş sıkıştırma bile kullanıyor ve dekompresyonun üst kısmındaki işleme rağmen, sıkıştırma aslında performansı arttırdı, çünkü yine de çok az değerli hızlı belleğe sahibiz. Şimdi, yaklaşık 30 megabaytlık bir uzay indeksi ile birlikte doku koordinatları, kenar oluşturma, malzeme atamaları vb.

İşte 8 milyondan fazla dörtlü ve G3 8400'lü bir i3'te çok telli bir alt şema içeren değişken prototip (bu birkaç yıl önceydi). Değişmez versiyonumdan daha hızlı, ancak üretimde kullanılmıyor, çünkü değişmez versiyonun bakımını çok daha kolay buldum ve performans vuruşu çok da kötü değil. Tel çerçevenin fasetleri göstermediğini, ancak yamalar (teller aslında eğriler, aksi takdirde tüm ağın tamamı siyah olacaktır), bir fasetteki tüm noktalar fırça tarafından değiştirilse de dikkat edin.

görüntü tanımını buraya girin

Her neyse, bellek yönetiminin çok yararlı olduğu bazı somut örnekler ve alanlar göstermek için bunlardan bazılarını göstermek istedim ve umarım insanlar da benim popomdan çıktığımı düşünmüyorlar. İnsanlar hafızanın çok ve ucuz olduğunu söylerken biraz sinirlenmeye meyilliyim çünkü bu DRAM ve sabit diskler gibi yavaş hafızadan bahsediyor. Hızlı hafızadan bahsettiğimiz zaman hala çok küçük ve çok kıymetlidir ve gerçekten kritik (yani, her şey için değil) ortak yolların performansı, o küçük miktardaki hızlı hafızaya oynamak ve elimizden geldiğince verimli kullanmakla ilgilidir. .

Bu tür bir şey için, örneğin C ++ gibi yüksek seviyeli nesneler tasarlamanıza izin veren bir dille çalışmak gerçekten yararlı olurken, bu nesneleri bir ya da daha fazla bitişik dizide saklayabilmenizi sağlar. tüm bu nesneler bitişik olarak temsil edilecek ve nesne başına yük gerektirmeyen bellek olmadan (ör: tüm nesnelerin yansıması veya sanal gönderime ihtiyacı yoktur). Performans açısından kritik olan bu alanlara gerçekten girdiğinizde, nesne yükünü önlemek, nesne maliyetlerini önlemek ve sık sık erişilen bellek tutmak için ilkel veri türlerini kullanmak, yani nesne havuzları üzerinde çalışmak ve ilkel veri türlerini kullanmak gibi bir bellek kontrolüne sahip olmak aslında verimlilik artışı olur. birlikte bitişik.

Bu yüzden, bellek yönetimi / kontrolü (ya da eksikliği) aslında benim durumumda, hangi dili en verimli bir şekilde sorunların üstesinden gelmeme izin vereceğimi seçmemdeki baskın sebep. Performans açısından kritik olmayan kod payımı kesinlikle yazıyorum ve bunun için C'den gömülmesi oldukça kolay olan Lua'yı kullanma eğilimindeyim.

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.