Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: Czyszczenie pamięci - Obiekty, funkcje

Czy w momencie pobrania danych z metody czyli:
1. Odwoluje się do metody obiektu
2. Metoda przetwarza instrukcje
3. Metoda zwraca rezultat do zmiennej

Czy w momencie zwrocenia rezultatu, wszyskie zmienne pomocnicze w tej metodzie - wyłanczając właściwości obiektu - są automatycznie czyszczone?Roman Piekarski edytował(a) ten post dnia 07.05.09 o godzinie 11:33
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Czyszczenie pamięci - Obiekty, funkcje

Myślę, że w tym wypadku metoda zachowuje się jak zwykła funkcja, tj zmienne dla których przestał istnieć kontekst (scope) są usuwane z pamięci. Pewności nie mam.
Karol Nowacki

Karol Nowacki Programista PHP,
Perl, C,
administrator
systemów *NIX

Temat: Czyszczenie pamięci - Obiekty, funkcje

to chyba rozwieje wątpliwości:
[kajoj@shellcode ~]$ cat test2.php
<?php
echo "Zamowana pamięć:\n";
echo "\t - przed zadeklarowaniem klasy ".memory_get_usage()."\n";

class test {
private $a = array();
public function __construct() {
$this->a = range(1, 100000);
}
public function metoda() {
$b = range(100000, 300000);
echo "\t - w trakcie wywołania metody ".memory_get_usage()."\n";
}
}

echo "\t - przed zainicjowaniem klasy ".memory_get_usage()."\n";
$c = new test();
echo "\t - przed wywołaniem metody ".memory_get_usage()."\n";
$c->metoda();
echo "\t - po wywołaniu metdoy ".memory_get_usage()."\n";

?>[kajoj@shellcode ~]$ php test2.php
Zamowana pamięć:
- przed zadeklarowaniem klasy 60268
- przed zainicjowaniem klasy 60396
- przed wywołaniem metody 10585880
- w trakcie wywołania metody 31635988
- po wywołaniu metdoy 10650420
[kajoj@shellcode ~]$
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: Czyszczenie pamięci - Obiekty, funkcje

Dzieki.

Wyglada na to ze pamiec jaka zostala wykozystana dla metody zwalnia się ale nie dokonca co sugeruje roznica miedzy:
" przed wywołaniem metody 10585880" a "po wywołaniu metody 10650420"

W celu calkowitego wyeliminowania zuzycia pamieci wymusilem unset na zmiennej $c co w teori powinno przywrocic stan pamieci do "przed zadeklarowaniem klasy", lecz wynik jest nie taki jak sądziłem:


<?php
class test {

private $a = array();

public function __construct() {

$this->a = range(1, 100000);

}

public function metoda() {

$b = range(100000, 300000);

//echo "\t - w trakcie wywołania metody ".memory_get_usage()."\n";

}

}



//echo "\t - przed zainicjowaniem klasy ".memory_get_usage()."\n";

$c = new test();

//echo "\t - przed wywołaniem metody ".memory_get_usage()."\n";

$c->metoda();
unset($c);
echo "\t - po wywołaniu metdoy ".memory_get_usage()."\n";

?>



- przed zainicjowaniem klasy 64264
- przed wywołaniem metody 10589940
- w trakcie wywołania metody 31640056
- po wywołaniu metdoy 129100

Wyglada na to, ze czyszczona jest pamiec wykozystana na zainicjowanie obiektu, ale tylko czesciowo, gdyz zostaja jakies smieci
Karol Nowacki:
to chyba rozwieje wątpliwości:
[kajoj@shellcode ~]$ cat test2.php
<?php[/quote]> echo "Zamowana pamięć:\n";[quote]echo "\t - przed zadeklarowaniem klasy ".memory_get_usage()."\n";

class test {
private $a = array();
public function __construct() {
$this->a = range(1, 100000);
}
public function metoda() {
$b = range(100000, 300000);
echo "\t - w trakcie wywołania metody ".memory_get_usage()."\n";
}
}

echo "\t - przed zainicjowaniem klasy ".memory_get_usage()."\n";
$c = new test();
echo "\t - przed wywołaniem metody ".memory_get_usage()."\n";
$c->metoda();
echo "\t - po wywołaniu metdoy ".memory_get_usage()."\n";

?>[kajoj@shellcode ~]$ php test2.php
Zamowana pamięć:
- przed zadeklarowaniem klasy 60268
- przed zainicjowaniem klasy 60396
- przed wywołaniem metody 10585880
- w trakcie wywołania metody 31635988
- po wywołaniu metdoy 10650420
[kajoj@shellcode ~]$
Roman Piekarski edytował(a) ten post dnia 07.05.09 o godzinie 13:43
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: Czyszczenie pamięci - Obiekty, funkcje

Znalazlem cos takiego, "optymalizacja wykozystania pamieci":
http://www.alexatnet.com/node/73
Stanisław P.

Stanisław P. Software designer

Temat: Czyszczenie pamięci - Obiekty, funkcje

Roman Piekarski:
Wyglada na to ze pamiec jaka zostala wykozystana dla metody zwalnia się ale nie dokonca co sugeruje roznica miedzy:
" przed wywołaniem metody 10585880" a "po wywołaniu metody 10650420"

Przy GC nie oczekiwałbym niczego innego. Nie wiem jaki php stosuje model czyszczenia pamięci, ale na lepszy wynik (tutaj 1%) raczej nie masz co liczyć...
Niektórymi danymi mogą się wogóle nie przejmować - jeśli masz możliwość zaalokować 10MB, to po co mają dealokować 100k? Te dane i tak znikną na końcu requestu :)
Karol Nowacki

Karol Nowacki Programista PHP,
Perl, C,
administrator
systemów *NIX

Temat: Czyszczenie pamięci - Obiekty, funkcje

fajnie, ale ta różnica wynika z czego innego. Po skompilowaniu skryptu php maszyna zend nie ładuje go całego do pamięci, ładowane jest tylko to co jest potrzebne. Zanie metoda zostanie wywołana pierwszy raz nie będzie jej w pamięci, natomiast po jej wywołaniu, jej kod nie jest usuwany, by kolejne jej wywołanie nastąpiło szybciej. i tak, różnica zajmowanej pamięci przed jaki i po kolejnym wywołaniu metody już nie będzie taka znacząca:

[kajoj@shellcode ~]$ cat test2.php
<?php

class test {
private $a = array();
public function __construct() {
$this->a = range(1, 10);
}
public function metoda() {
$b = range(100000, 300000);
echo memory_get_usage()."\n";
}
}

$c = new test();
$c->metoda();

echo memory_get_usage()."\n";
$c->metoda();
echo memory_get_usage()."\n";

?>[kajoj@shellcode ~]$ php test2.php
21110940
125384
21111236
125344
a nawet jak tu widzimy, po drugim wywołaniu metody mamy mniej zajmowanej pamięci... pewnie dlatego że GC coś już posprzątał

konto usunięte

Temat: Czyszczenie pamięci - Obiekty, funkcje

Stanisław Pitucha:
Roman Piekarski:
Wyglada na to ze pamiec jaka zostala wykozystana dla metody zwalnia się ale nie dokonca co sugeruje roznica miedzy:
" przed wywołaniem metody 10585880" a "po wywołaniu metody 10650420"

Przy GC nie oczekiwałbym niczego innego. Nie wiem jaki php stosuje model czyszczenia pamięci, ale na lepszy wynik (tutaj 1%) raczej nie masz co liczyć...
Niektórymi danymi mogą się wogóle nie przejmować - jeśli masz możliwość zaalokować 10MB, to po co mają dealokować 100k? Te dane i tak znikną na końcu requestu :)

A to nie jest tak,że zmienne lokalne metody/funkcji są alokowane na stosie a to już jest poza "jurysdykcją" GC?

pzdr
Stanisław P.

Stanisław P. Software designer

Temat: Czyszczenie pamięci - Obiekty, funkcje

Paweł W.:
A to nie jest tak,że zmienne lokalne metody/funkcji są alokowane
na stosie a to już jest poza "jurysdykcją" GC?

W językach z kompilacją, bardziej inteligentnymi zasadami co do typów, escape analysis, itd. - oczywiście. Ale bądźmy poważni - to jest php ;)
Java też tego nie robiła przez 6'ką. Z "popularnych" VM tylko .NET to potrafił "od zawsze".

Następna dyskusja:

Zend czyszczenie sesji.




Wyślij zaproszenie do