Perl Language
Optymalizacja wykorzystania pamięci
Szukaj…
Czytanie plików: foreach vs. while
Podczas czytania potencjalnie dużego pliku, A while
pętla ma znaczną przewagę nad pamięci foreach
. Następujące pliki będą czytać rekord pliku według rekordów (domyślnie „rekord” oznacza „linię” określoną przez $/
), przypisując każdemu do $_
podczas odczytu:
while(<$fh>) {
print;
}
Operator diamentów robi tutaj trochę magii, aby upewnić się, że pętla kończy się tylko na końcu pliku, a nie np. W wierszach zawierających tylko znak „0”.
Następująca pętla wydaje się działać tak samo, jednak ocenia operatora diamentu w kontekście listy, powodując, że cały plik jest odczytywany za jednym razem:
foreach(<$fh>) {
print;
}
Jeśli i tak korzystasz z jednego rekordu na raz, może to spowodować ogromne marnowanie pamięci i dlatego należy tego unikać.
Przetwarzanie długich list
Jeśli masz już listę w pamięci, prostym i zwykle wystarczającym sposobem jej przetworzenia jest prosta pętla foreach
:
foreach my $item (@items) {
...
}
Jest to w porządku, np. W typowym przypadku przetwarzania jakiegoś $item
a następnie zapisywania go do pliku bez przechowywania danych. Jednak, jeśli można zbudować jakąś inną strukturę danych z pozycji, A while
pętla jest bardziej wydajna pamięć:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
O ile odniesienie do $item
bezpośrednio na liście wyników, elementy, które przesunąłeś z tablicy @items
mogą zostać zwolnione, a pamięć ponownie wykorzystana przez interpreter po przejściu do iteracji następnej pętli.