Perl Language
Optimering av minnesanvändning
Sök…
Läser filer: förut mot medan
När du läser en potentiellt stor fil, en while
har loop en betydande minne fördel gentemot foreach
. Följande kommer att läsa filposten efter post (som standard betyder "post" "en rad", som anges av $/
), och tilldelar var och en till $_
som den är läst:
while(<$fh>) {
print;
}
Diamantoperatören gör lite magi här för att se till att slingan endast avslutas i slutet av filen och inte t.ex. på linjer som bara innehåller ett "0" -tecken.
Följande slinga verkar fungera precis på samma sätt, men utvärderar diamantoperatören i listkontext, vilket gör att hela filen läses på en gång:
foreach(<$fh>) {
print;
}
Om du ändå arbetar med en post åt gången kan detta resultera i ett enormt slöseri med minnet och bör därför undvikas.
Bearbetar långa listor
Om du redan har en lista i minnet är det enkla och vanligtvis tillräckliga sättet att bearbeta den en enkel foreach
:
foreach my $item (@items) {
...
}
Det här är bra, t.ex. för det vanliga fallet att göra en del bearbetning på $item
och sedan skriva ut den till en fil utan att hålla informationen kvar. Men om du bygger upp en annan datastruktur från föremålen, en while
slinga är mer minne effektiv:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
Såvida inte en hänvisning till $item
hamnar direkt i din resultatlista, kan objekt som du skiftade från @items
array frigöras och minnet återanvändas av tolkar när du går in i nästa loop-iteration.