Po co się benchmarkuje zużycie pamięci?

Po co się benchmarkuje zużycie pamięci?

Kolega podlinkował mi dziś test zużycia pamięci przez przeglądarki. Test jest zaopatrzony w ładny wykres pokazujący która przeglądarka ile żre, porządny opis na czym test polegał itp. Tylko wnioski wyciągnięte przez autora testu jakieś ubogie.

Autor, Sam Allen, napisał program który odpali w przeglądarce 150 najpopularniejszych stron i będzie monitorował zużycie pamięci. Opisał, na czym dokładniej polegał test i przedstawił wyniki w formie ładnego wykresu.

Zastanawia mnie, jakie to ma znaczenie, ile pamięci przeglądarka zajmuje? Na maszynie z 4GiB pamięci operacyjnej (taka była maszyna testowa) kiszenie się procesu na kilkuset MiB przy kilkuset otwartych stronach jest trochę bez sensu. Ostatecznie więcej danych trzeba doczytywać z dysku, a ten ma dłuższy czas dostępu.

Pamiętam też, jak wykładowcy od wprowadzenia do programowania oraz algorytmów i struktur danych tłumaczyli, że czasem dodanie kilku zmiennych pozwala radykalnie podnieść wydajność programu. Jest to logiczne. Gdy weźmiemy podstawową strukturę, jaką jest lista uporządkowana to najłatwiej mieć zapisany tylko wskaźnik na początek listy. Jednak wygodnie jest też posiadać wskaźnik na koniec listy, gdyż chcąc dodać element na koniec, z najwyższym (lub najniższym, zależnie od rodzaju listy) priorytetem możemy po prostu to zrobić, bez przeszukiwania całej listy. Posiadając wskaźniki na wybrane środkowe elementy możemy dalej skrócić czas odnajdywania właściwego miejsca w liście.

Wybierając bardziej skomplikowaną strukturę danych, drzewo czerwono-czarne mamy jeszcze większy nadmiar danych, bo trzymamy dla każdego węzła informację o jego lewym i prawym child’zie (sorry, słowo dziecko mi jakoś nie odpowiada i z pedofilią się kojarzy). Oczywiście możemy ułożyć drzewo w formie tablicy. Zmniejszymy nadmiar, ale dodanie elementu będzie się odbywało koszem większej ilości operacji przepisywania danych przy wyważaniu drzewa.

Mając na uwadze, że często większa złożoność pamięciowa wiąże się z mniejszą złożonością czasową mogę postawić tezę, że programy używające mniej danych są wolniejsze od tych, które mają największe zapotrzebowanie na RAM, prawda?

Wracając do pytania, które zadałem w temacie: po co się robi benchmark zużycia RAMu? Ram jest tani. Wygodniej jest dołożyć kość RAMu niż tracić czas na wykonanie powolnego, ale oszczędnego pod względem pamięci algorytmu. Po co testować coś, co dla końcowego odbiorcy będzie bez większego znaczenia i pokazywać jako przewagę, podczas gdy działanie programu z najlepszym wynikiem teście jest dużo gorsze?

Benchmark zużycia pamięci przez przeglądarki Safari, Firefox, Opera i Chrome: http://dotnetperls.com/chrome-memory

  • > Pamiętam też, jak wykładowcy od wprowadzenia do programowania oraz algorytmów i struktur danych tłumaczyli, że czasem dodanie kilku zmiennych pozwala radykalnie podnieść wydajność programu

    Masz kiepskich nauczycieli, albo przespałeś ten wykład. Optymalizować można – w przypadku nierównoległych programów – 2 rzeczy, czas, lub zużycie pamięci właśnie. Jedno kosztem drugiego. Jak słusznie zauważyłeś, częściej zależy nam na czasie. Ale nie zawsze. Bo nie wszyscy mają nie wiadomo ile tego taniego RAMu. I dobrze byłoby gdyby tacy eksperci produkujący pewne systemy operacyjne łaskawie to zauważyli. Bo jak nie mają go za dużo, to zaczyna mieleć dysk – wirtualny RAM, a to nie jest ani szybkie, ani miłe. A oprócz przeglądarki jest jeszcze wiele programów do uruchomienia.

    A tak w ogóle, to nie zauważyłeś, że zmniejsza się zużycie pamięci, ale program nie działa wiele wolniej, znaczy, że widać się dało.

  • Mnie również zawsze dziwiły testy na zajętość pamięci – oczywiście 10 otwartych stron nie powinno zajmować 1 GiB. Ale generalnie to się cieszę, gdy program robi użytek z pamięci RAM.

    > Mając na uwadze, że często większa złożoność pamięciowa wiąże się z mniejszą złożonością czasową mogę postawić tezę, że programy używające mniej danych są wolniejsze od tych, które mają największe zapotrzebowanie na RAM, prawda?

    Prawda. To nawet widać gołym okiem, że Firefox chodzi jak muł, a Opera szybko.

  • Zal

    A ja powiem jeszcze więcej – można wykorzystywać wiele pamięci, a i tak mieć problemy z wydajnością. Optymalizacja zużycia pamięci nie zawsze musi się odbywać kosztem czasu działania programu, gdy np. ma się spieprzoną implementację, lub projekt. Nie wspominając o wyciekach pamięci. Teoria to jedno, a praktyka to drugie.

    Co do zasobożerności – a próbowałeś korzystać ze współczesnych przeglądarek na systemach z 64, lub 128 MiB RAM-u? Pamięć jest tania, ale to nie usprawiedliwia intelektualnego niechlujstwa.

    I jeszcze jedno – nawiązanie do pedofilii w kontekście algorytmiki jest słabe. Języka polskiego nie trzeba się wstydzić i nie trzeba go przeplatać anglojęzycznymi wstawkami w momencie, gdy istnieją polskie odpowiedniki.

  • Zużycie pamięci to nie tylko kwestia używanych algorytmów, a optymalizacja nie zawsze jest kosztem czegoś (ale zazwyczaj.

    Warto optymalizować zajętość pamięci RAM z jednego powodu: algorytmy zużywające mniej pamięci są bardzo często szybsze niż te co używają jej dużo, z prostej przyczyny: cache procesora. Algorytmy które ‚nie mieszczą’ się cache, znacznie spowalniają.

  • Jakiś czas temu opisałem ten test u siebie, "Zużycie pamięci w przeglądarkach internetowych: Chrome 3, Firefox 3.5, Opera 10, Safari 4"* – mogą Cię zainteresować wnioski i komentarze czytelników.

    * – http://grzglo.jogger.pl/2009/06/22/zuzycie-pamieci-w-przegladarkach-internetowych/

  • @Grzegorz: wnioski ciekawe, często pokrywające się z moimi, czasem nieco bardziej rozbudowane. Mobilizujące do przeprowadzenia jeszcze jednego testu, ale bardziej rzetelnego, przeprowadzonego w wyizolowanym środowisku. Dzięki za link!

    @AdamK:
    Jest algorytm sortowania stringów, który dość mocno obciąża pamięć, bo używa kopii danych zamiast referencji. Całość odbywa się przy użyciu drzewa typu trie. Autorzy dzięki temu więcej pracy przełożyli do cache’a właśnie. W wolnej chwili znajdę odpowiedni tekst i podlinkuję, jeśli jesteś zainteresowany.

    @Zal: masz dużo racji, ale nie powiesz mi, że na komputerze z 128MiB RAMu odpalisz 150 zakładek na raz 😉
    Polskie nazwy mi po prostu nie odpowiadają.

    @Sigvatr: Możliwe, że w tym czasie spałem, ale raczej w domu niż na sali wykładowej 😉
    Uwagi o systemach operacyjnych w notce nie zrobiłem, chociaż przeszła mi ona przez myśl.

  • Jak to zostało już powiedziane w komentarzach, algorytmy zużywające więcej pamięci wcale nie muszą być szybsze. Co więcej, nawet jeżeli algorytm taki jest teoretycznie szybszy to może się okazać, że z uwagi na cache procesora w praktyce będzie wolniejszy.

    Ale co chciałbym dodać do wzmiankę, że przecież nie każdy komputer ma 4GiB. Coraz popularniejsze są nettopy, które pamięci mają jeden GiB i wówczas to czy przeglądarka zajmuje pięćset czy sto MiB jest bardzo istotne.

  • "Polskie nazwy mi po prostu nie odpowiadają."
    Może będzie to dla Ciebie szok, ale nic nikogo to nie obchodzi. Jeżeli piszesz po polsku to pisz po polsku. Tymczasem nawet wyraz angielski źle odmieniłeś.

  • sin

    Moja propozycja tłumaczenia słowa child: potomek.

    No, a wracając do przeglądarek, to muszę się zgodzić z Sigvatrem. Często korzystam z komputera posiadającego 512MiB RAM i nawet Firefoksowi, który w teście osiągnął najlepsze wyniki, często brakuje pamięci. System + kilka drobnych aplikacji działających w tle to już jest 200MiB, Fx z kilkoma zainstalowanymi dodatkami bardzo szybko wyciąga kolejne 300MiB i w tym momencie zaczyna się "milenie dysku", a wydajność drastycznie spada… 512MiB jak na polskie warunki to mało nie jest, tylko gdzieś w okolicach poniżej przeciętnej, jak nie lepiej.

    Tak, wystarczy dokupić trochę RAM-u, który jest tani. Tylko powiedz to przeciętnemu użytkownikowi komputera. Nie każdy będzie wiedział, że za 50zł może znacznie poprawić wydajność. Dla większości użytkowników zbyt wolny komputer oznacza zakup nowego, pewnie po promocji w MediaMarkt. Dostanie komputer z pre-instalowaną Vistą i 1GiB RAM (perełki Vistą i 512MiB RAM też się trafiały) i właściwie znajdzie się w punkcie wyjścia.

    Programiści i producenci oprogramowania powinni brać pod uwagę takie scenariusze i szukać najlepszej równowagi pomiędzy szybkością, a zapotrzebowaniem na RAM… o jak najlepszej optymalizacji i zapobieganiu wyciekom pamięci nie wspominając.

  • Jest jeszcze jeden powód. Każdy w miarę przyzwoity OS używa wolnej pamięci jako cache dysku. Jeśli masz 2GB RAM i przeglądarka zeżre Ci 1GB, na cache dysku zostanie około ~0,5GB. Może i dużo, ale w tym musi się zmieścić bufor wejściowy (pamięć raz odczytanych danych), wyjściowy (dane które mają być zapisane na nośnik) i wszelkie listy katalogów. To miłe rozegrać partyjkę w np. Left 4 Dead, potem wyjść z gry, pogadać na jakimś jabberze/IRCu, przejrzeć RSSy i zagrać znowu, nie czekając aż wszystko ponownie dogra się z dysku 😉

  • Sin i Branch Predictor: weźcie pod uwagę, że zużycie RAMu rzędu 1GiB w przypadku Chrome’a pojawia się w momencie otwarcia 150 zakładek. Nikt normalny na sprzęcie z <1GiB RAMu nie uruchamia tyle.
    Warto też zauważyć, że od razu po przetworzeniu danych zużycie pamięci w Chrome spada do poziomu podobnego do Firefoksa, a czasem nawet niższego.
    No i trzeba też wziąć pod uwagę, że Firefox i Opera w odróżnieniu od Chrome’a pracują w jednym procesie, a Chrome ma tyle procesów ile kart plus jeden zarządzający nimi. Jak wynika z komentarza Michała Górnego pod notką u Grzegorza, pamięć dzielona liczona jest w takim przypadku wiele razy, chociaż de facto zajmuje miejsce tylko raz. To jest znacząca wada metodologii testu i podważa jego wiarygodność w kontekście Chrome’a, którego test dotyczy. Jaki jest sens przeprowadzania testu zużycia pamięci w ten sposób, w tym przypadku? Bo moim zdaniem – żaden.

  • Jedną sprawą jest to czy test jest wiarygodny i przeprowadzony poprawnie, a inną czy warto takie testy przeprwoadzać. W pierwszej kwestii obstawiałbym, że nie, a w drugiej, że tak.

  • @mt30: Taaa, tylko że skąd user ma wiedzieć ile kart może otworzyć? Pilnować cały czas ilości wolnego RAMu? To twórcy przeglądarki powinni pilnować by nie było absurdalnie duże.

  • (użycie pamięci, w sensie).

  • mt3o: Zużycie rzędu 1GiB w Chorme w tym teście odnośiło się do otwarcia nie 150 kart na raz, tylko 30 kart.

    Dodatkowe założenia testu wyglądały następująco: Po wywołaniu 30 adresów testerzy każdorazowo sprawdzali ewentualne komunikaty ze strony przeglądarki. Następnie zamykano 29 z 30 kart, co miało na celu symulację normalnego użytkowania (otwarcie kilkunastu do kilkudziesięciu stron, pominięto przechodzenie wstecz i naprzód).

    Wszystko to jest w moim wcześniejszym odnośniku.

  • hmm.. fakt. musiałem niedoczytać tego wcześniej.

  • Myślę że w dzisiejszych czasach mógłby się przydać OSowy garbage collector, który w odpowiednich momentach mógłby zgłaszać aplikacjom potrzebę zwolnienia pamięci. Ma to sens, zwłaszcza że coraz więej aplikacji wykonuje się w różnego rodzaju maszynach wirtualnych – oczywiście pozostaje problemem kiedy i do jakich aplikacji taki OSowy collector powinien wysyłać takie ‚prośby’, ale myślę że ma to sens.

  • Kiedyś nawet coś takiego działało -> http://msdn.microsoft.com/en-us/library/ms632618(VS.85).aspx

  • AFAIK programy pisane pod windows mobile mają taką funkcjonalność. Przynajmniej te w Javie.
    Jest też program, który tnie priorytet wykonywanego procesu, jeśli ten za długo zajmuje określony % czasu procesora.