Podczas przeglądania książki "Intermediate Perl" zauważyłem sekcję o Schwartzian Transforms i wypróbowałem przykład w ćwiczeniu (9.9.2), ale zauważyłem, że wiele przebiegów spowodowało, że transformacja zabiera więcej czasu niż zwykły sort. Kod tutaj dokonuje prostego sortowania plików w folderze Windows \ System32 na podstawie rozmiaru pliku -Kiedy są transformacje Schwartzian przydatne?
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
my $time = timethese(10, {
testA => sub { map $_->[0],
sort {$a->[1] <=> $b->[1]}
map [$_, -s $_],
glob "C:\\Windows\\System32\\*";
},
testB => sub { sort { -s $a <=> -s $b } glob "C:\\Windows\\System32\\*";
},
}
);
wyjście jest -
Benchmark: timing 10 iterations of testA, testB...
testA: 11 wallclock secs (1.89 usr + 8.38 sys = 10.27 CPU) @ 0.97/s (n=10)
testB: 5 wallclock secs (0.89 usr + 4.11 sys = 5.00 CPU) @ 2.00/s (n=10)
Moje zrozumienie, że od operacji pliku (-s) musi być powtarzany w kółko w przypadku testB, powinien działać znacznie wolniej niż testA. Wynik jednak odbiega od tej obserwacji. Czego tu mi brakuje?
Problem polegał na tym, że podczas sortowania zwracana była wartość skalarna. Zmiana, która naprawiła problem. Czy możesz sprawdzić, czy wyrażenie na mapie jest "nieprawidłowe"? Instrukcja stwierdza, że mapa działa jako mapa LISTA BLOKÓW // mapa WYRAŻ, LISTA. W moim przypadku oba z nich działają dobrze. – aks
Myślałem, że ostrzeżenia dostałem się tam, gdzie zostało wywołane przez to użycie mapy. Ja sprawdzę. – innaM
Masz rację. Ale gdzie te ostrzeżenia się pojawiły? – innaM