EnglishFrenchSpanyol

Favicon OnWorks

perlperf - Dalam talian di Awan

Jalankan perlperf dalam penyedia pengehosan percuma OnWorks melalui Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS

Ini ialah perintah perlperf yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.

JADUAL:

NAMA


perlperf - Prestasi Perl dan Teknik Pengoptimuman

DESCRIPTION


Ini adalah pengenalan kepada penggunaan prestasi dan teknik pengoptimuman yang boleh
digunakan dengan rujukan khusus kepada program perl. Walaupun ramai pembangun perl telah datang
daripada bahasa lain, dan boleh menggunakan pengetahuan sedia ada mereka di mana sesuai, terdapat banyak
orang lain yang mungkin mendapat manfaat daripada beberapa petunjuk khusus perl. Jika anda mahukan
versi pekat, mungkin nasihat terbaik datang dari Samurai Jepun yang terkenal,
Miyamoto Musashi, yang berkata:

"Jangan Terlibat dalam Aktiviti Tidak Berfaedah"

pada tahun 1645.

TINJAUAN


Mungkin kesilapan yang paling biasa dilakukan oleh pengaturcara ialah cuba mengoptimumkan kod mereka
sebelum program benar-benar melakukan sesuatu yang berguna - ini adalah idea yang tidak baik. Tiada gunanya
mempunyai program yang sangat pantas yang tidak berfungsi. Kerja pertama adalah untuk mendapatkan program untuk
betul lakukan sesuatu berguna, (apatah lagi memastikan suite ujian adalah sepenuhnya
berfungsi), dan baru mempertimbangkan untuk mengoptimumkannya. Setelah memutuskan untuk mengoptimumkan sedia ada
kod kerja, terdapat beberapa langkah mudah tetapi penting untuk dipertimbangkan yang mana yang intrinsik
kepada sebarang proses pengoptimuman.

SATU LANGKAH TEPI
Pertama, anda perlu menetapkan masa garis dasar untuk kod sedia ada, yang memerlukan masa
boleh dipercayai dan boleh diulang. Anda mungkin mahu menggunakan "Tanda Aras" atau
Modul "Devel::NYTProf", atau sesuatu yang serupa, untuk langkah ini, atau mungkin sistem Unix
utiliti "masa", yang mana sesuai. Lihat pangkalan dokumen ini untuk senarai yang lebih panjang
penanda aras dan modul pemprofilan, dan disyorkan bacaan lanjut.

SATU LANGKAH KE DEPAN
Seterusnya, setelah meneliti program untuk panas tempat-tempat, (tempat di mana kod itu nampaknya dijalankan
perlahan-lahan), tukar kod dengan niat untuk menjadikannya berjalan lebih pantas. Menggunakan versi
perisian kawalan, seperti "subversi", akan memastikan tiada perubahan tidak dapat dipulihkan. Ia terlalu
mudah untuk bermain biola di sini dan di sana - jangan berubah terlalu banyak pada satu-satu masa atau anda mungkin
tidak menemui sekeping kod benar-benar adalah yang perlahan.

LAGI LANGKAH TEPI
Tidak cukup untuk mengatakan: "itu akan menjadikannya berjalan lebih cepat", anda perlu menyemaknya. Jalankan semula
kod di bawah kawalan penanda aras atau modul pemprofilan, dari langkah pertama di atas,
dan semak bahawa kod baharu melaksanakan sama tugasan in kurang masa. Simpan kerja anda dan
ulang...

UMUM GARIS PANDUAN


Perkara kritikal apabila mempertimbangkan prestasi adalah untuk mengingati bahawa tidak ada perkara seperti a
"Peluru Emas", itulah sebabnya tiada peraturan, hanya garis panduan.

Adalah jelas bahawa kod sebaris akan menjadi lebih pantas daripada panggilan subrutin atau kaedah,
kerana terdapat kurang overhed, tetapi pendekatan ini mempunyai kelemahan iaitu kurang
boleh diselenggara dan memerlukan kos penggunaan memori yang lebih besar - tidak ada perkara seperti a
makan tengah hari percuma. Jika anda sedang mencari elemen dalam senarai, ia boleh menjadi lebih cekap untuk
simpan data dalam struktur cincang, dan kemudian lihat untuk melihat sama ada kuncinya
ditakrifkan, bukannya untuk menggelung seluruh tatasusunan menggunakan grep() contohnya. substr()
mungkin (banyak) lebih cepat daripada grep() tetapi tidak begitu fleksibel, jadi anda mempunyai satu lagi pertukaran untuk
akses. Kod anda mungkin mengandungi baris yang mengambil masa 0.01 saat untuk melaksanakan yang jika anda
memanggilnya 1,000 kali, berkemungkinan besar dalam program menghuraikan walaupun fail bersaiz sederhana untuk
contohnya, anda sudah mempunyai kelewatan 10 saat, hanya dalam satu lokasi kod tunggal, dan jika anda
panggil talian itu 100,000 kali, keseluruhan program anda akan menjadi perlahan kepada rangkak yang tidak dapat ditanggung.

Menggunakan subrutin sebagai sebahagian daripada jenis anda ialah cara yang berkesan untuk mendapatkan apa yang anda mahukan,
tetapi biasanya akan lebih perlahan daripada terbina dalam mengikut abjad "cmp" dan angka "" isih
pengendali. Anda boleh membuat beberapa hantaran ke atas data anda, membina indeks ke
menjadikan jenis yang akan datang lebih cekap, dan menggunakan apa yang dikenali sebagai "OM" (Orcish
Manuver) untuk menyimpan kekunci isihan terlebih dahulu. Pencarian cache, walaupun idea yang bagus, boleh
sendiri menjadi punca kelembapan dengan menguatkuasakan pas dua kali ke atas data - sekali untuk persediaan
cache, dan sekali untuk mengisih data. Menggunakan "pack()" untuk mengekstrak kekunci isihan yang diperlukan
menjadi rentetan yang konsisten boleh menjadi cara yang cekap untuk membina rentetan tunggal untuk dibandingkan,
bukannya menggunakan kekunci isihan berbilang, yang memungkinkan untuk menggunakan standard, bertulis
dalam "c" dan pantas, fungsi perl "sort()" pada output, dan merupakan asas kepada "GRT"
(Transformasi Guttman Rossler). Sesetengah kombinasi rentetan boleh memperlahankan "GRT", dengan hanya
menjadi terlalu kompleks untuk kebaikannya sendiri.

Untuk aplikasi yang menggunakan backend pangkalan data, ruang nama "DBix" standard telah cuba membantu
dengan menjaga sesuatu yang rapi, tidak kurang kerana ia cuba melakukannya tidak pertanyaan pangkalan data sehingga
masa terkini yang mungkin, tetapi sentiasa baca dokumen yang disertakan dengan perpustakaan pilihan anda.
Antara banyak isu yang dihadapi oleh pembangun yang berurusan dengan pangkalan data harus kekal sedar ialah
untuk sentiasa menggunakan ruang letak "SQL" dan untuk mempertimbangkan pra-mengambil set data apabila ini mungkin
terbukti berfaedah. Membahagikan fail besar dengan memberikan berbilang proses untuk menghurai
satu fail, menggunakan sebut "POE", "benang" atau "garpu" juga boleh menjadi cara yang berguna untuk mengoptimumkan
penggunaan sumber "CPU" yang tersedia, walaupun teknik ini penuh dengan
isu konkurensi dan menuntut perhatian yang tinggi terhadap perincian.

Setiap kes mempunyai aplikasi khusus dan satu atau lebih pengecualian, dan tidak ada
penggantian untuk menjalankan beberapa ujian dan mengetahui kaedah yang paling sesuai untuk anda
persekitaran tertentu, inilah sebab mengapa menulis kod optimum bukanlah sains yang tepat, dan mengapa
kami sangat suka menggunakan Perl - TMTOWTDI.

BENCHMARKS


Berikut ialah beberapa contoh untuk menunjukkan penggunaan alat penanda aras Perl.

Menugaskan and Penghormatan Pemboleh ubah
Saya pasti kebanyakan kita telah melihat kod yang kelihatan seperti, (atau lebih teruk daripada), ini:

jika ( $obj->{_ref}->{_myscore} >= $obj->{_ref}->{_yourscore} ) {
...

Kod sebegini boleh menjelikkan mata untuk dibaca, serta sangat sensitif terhadap kesilapan menaip,
dan lebih jelas untuk menyahrujuk pembolehubah secara eksplisit. Kami melangkah ke tepi
isu bekerja dengan teknik pengaturcaraan berorientasikan objek untuk merangkum pembolehubah
akses melalui kaedah, hanya boleh diakses melalui objek. Di sini kita hanya membincangkan
pelaksanaan teknikal pilihan, dan sama ada ini mempunyai kesan ke atas prestasi. Kita boleh
lihat sama ada operasi penyahrujukan ini, mempunyai sebarang overhed dengan memasukkan kod perbandingan
fail dan menjalankan ujian "Tanda Aras".

# dereference

#!/usr/bin/perl

gunakan ketat;
gunakan amaran;

gunakan Penanda Aras;

$ref saya = {
'ref' => {
_myscore => '100 + 1',
_yourscore => '102 - 1',
},
};

timethese(1000000, {
'direct' => sub {
$x saya = $ref->{ref}->{_myscore} . $ref->{ref}->{_yourscore} ;
},
'dereference' => sub {
$ref saya = $ref->{ref};
$myscore saya = $ref->{_myscore};
$yourscore saya = $ref->{_yourscore};
saya $x = $myscore. $yourscore;
},
});

Adalah penting untuk menjalankan apa-apa pengukuran masa dengan bilangan kali yang mencukupi supaya bilangannya
menyelesaikan pada purata berangka, jika tidak setiap larian akan turun naik secara semula jadi disebabkan oleh
variasi dalam persekitaran, untuk mengurangkan kesan perbalahan untuk sumber "CPU" dan
lebar jalur rangkaian contohnya. Menjalankan kod di atas untuk satu juta lelaran, kita boleh
lihat pada output laporan oleh modul "Tanda Aras", untuk melihat pendekatan yang mana
paling berkesan.

$> perl dereference

Penanda aras: pemasaan 1000000 lelaran penyahrujukan, langsung...
dereference: 2 saat jam dinding ( 1.59 usr + 0.00 sys = 1.59 CPU) @ 628930.82/s (n=1000000)
terus: 1 jam dinding saat ( 1.20 usr + 0.00 sys = 1.20 CPU) @ 833333.33/s (n=1000000)

Perbezaannya jelas untuk dilihat dan pendekatan dereferencing adalah lebih perlahan. Walaupun ia berjaya
untuk melaksanakan purata 628,930 kali sesaat semasa ujian kami, pendekatan langsung
berjaya menjalankan tambahan 204,403 kali, malangnya. Malangnya, kerana ada
adalah banyak contoh kod yang ditulis menggunakan akses pembolehubah langsung berbilang lapisan, dan
ia selalunya mengerikan. Walau bagaimanapun, ia adalah lebih cepat. Persoalannya tetap sama ada
keuntungan minit sebenarnya berbaloi dengan keletihan mata, atau kehilangan kebolehselenggaraan.

Cari and menggantikan or tr
Jika kita mempunyai rentetan yang perlu diubah suai, manakala regex hampir selalunya banyak
lebih fleksibel, "tr", alat yang sering kurang digunakan, masih boleh berguna. Satu senario mungkin
menggantikan semua vokal dengan aksara lain. Penyelesaian regex mungkin kelihatan seperti ini:

$str =~ s/[aeiou]/x/g

Alternatif "tr" mungkin kelihatan seperti ini:

$str =~ tr/aeiou//

Kita boleh memasukkannya ke dalam fail ujian yang boleh kita jalankan untuk menyemak pendekatan mana yang paling pantas,
menggunakan pembolehubah $STR global untuk menetapkan kepada pembolehubah "$str saya" untuk mengelakkan perl
cuba mengoptimumkan mana-mana kerja dengan melihat ia diberikan sekali sahaja.

# transliterasi regex

#!/usr/bin/perl

gunakan ketat;
gunakan amaran;

gunakan Penanda Aras;

my $STR = "$$-ini dan itu";

timethese( 1000000, {
'sr' => sub { $str saya = $STR; $str =~ s/[aeiou]/x/g; pulangkan $str; },
'tr' => sub { $str saya = $STR; $str =~ tr/aeiou//; pulangkan $str; },
});

Menjalankan kod memberikan hasil kami:

$> perl regex-transliterate

Penanda aras: pemasaan 1000000 lelaran sr, tr...
sr: 2 jam dinding saat ( 1.19 usr + 0.00 sys = 1.19 CPU) @ 840336.13/s (n=1000000)
tr: 0 jam dinding saat ( 0.49 usr + 0.00 sys = 0.49 CPU) @ 2040816.33/s (n=1000000)

Versi "tr" adalah pemenang yang jelas. Satu penyelesaian adalah fleksibel, satu lagi adalah pantas - dan
ia adalah sewajarnya pilihan pengaturcara untuk digunakan.

Semak dokumen "Tanda Aras" untuk teknik berguna selanjutnya.

PROFIL TOOLS


Sekeping kod yang lebih besar sedikit akan memberikan sesuatu yang boleh dihasilkan oleh pemprofil
statistik pelaporan yang lebih meluas. Contoh ini menggunakan program "padan kata" ringkas
yang menghuraikan fail input yang diberikan dan memuntahkan laporan ringkas tentang kandungannya.

# padanan perkataan

#!/usr/bin/perl

gunakan ketat;
gunakan amaran;

=head1 NAMA

kata fail - analisis perkataan fail input

=kepala1 SINOPSIS

kata fail -f input nama fail [-d]

=kepala1 HURAIAN

Program ini menghuraikan nama fail yang diberikan, ditentukan dengan C, dan memaparkan a
analisis ringkas perkataan yang terdapat di dalamnya. Gunakan suis C untuk mendayakan
menyahpepijat mesej.

= potong

gunakan FileHandle;
gunakan Getopt::Long;

$debug saya = 0;
$file saya = '';

$result saya = GetOptions (
'debug' => \$debug,
'file=s' => \$fail,
);
die("invalid args") melainkan $result;

melainkan ( -f $file ) {
die("Penggunaan: $0 -f nama fail [-d]");
}
my $FH = FileHandle->new("< $file") atau die("unable to open file($file): $!");

$i_LINES saya = 0;
$i_WORDS saya = 0;
%count saya = ();

@lines saya = ;
foreach $line saya ( @lines ) {
$i_LINES++;
$line =~ s/\n//;
my @words = split(/ +/, $line);
my $i_words = skalar(@words);
$i_WORDS = $i_WORDS + $i_words;
debug("line: $i_LINES membekalkan $i_words perkataan: @words");
$i_word saya = 0;
foreach $word saya ( @words ) {
$i_word++;
$count{$i_LINES}{spec} += padanan($i_word, $word, '[^a-zA-Z0-9]');
$count{$i_LINES}{only} += padanan($i_word, $word, '^[^a-zA-Z0-9]+$');
$count{$i_LINES}{cons} += padanan($i_word, $word, '^[(?i:bcdfghjklmnpqrstvwxyz)]+$');
$count{$i_LINES}{vows} += padanan($i_word, $word, '^[(?i:aeiou)]+$');
$count{$i_LINES}{caps} += padanan($i_word, $word, '^[(A-Z)]+$');
}
}

cetak laporan(%count);

sub padanan {
my $i_wd = shift;
my $word = shift;
$regex saya = shift;
$has saya = 0;

jika ($perkataan =~ /($regex)/ ) {
$has++ jika $1;
}

debug("perkataan: $i_wd ".($mempunyai ? 'padanan' : 'tidak sepadan')." aksara: /$regex/");

pulangan $has;
}

laporan kecil {
%laporan saya = @_;
%rep saya;

foreach $line saya ( kunci %report ) {
foreach saya $key ( keys %{ $report{$line} } ) {
$rep{$key} += $report{$line}{$key};
}
}

$laporan saya = qq|
$0 laporan untuk $file:
baris dalam fail: $i_LINES
perkataan dalam fail: $i_WORDS
perkataan dengan aksara khas (bukan perkataan): $i_spec
perkataan dengan aksara khas (bukan perkataan) sahaja: $i_only
perkataan dengan konsonan sahaja: $i_cons
perkataan dengan huruf besar sahaja: $i_caps
perkataan dengan hanya vokal: $i_vows
|;

pulangkan $laporan;
}

sub nyahpepijat {
my $message = shift;

jika ( $debug ) {
cetak STDERR "DBG: $message\n";
}
}

keluar 0;

Devel::DPof
Modul yang dihormati ini telah menjadi standard de-facto untuk pemprofilan kod Perl selama lebih daripada
sedekad, tetapi telah digantikan dengan beberapa modul lain yang telah membawa kita kembali ke
abad ke-21. Walaupun anda disyorkan untuk menilai alat anda daripada beberapa
disebut di sini dan daripada senarai CPAN di dasar dokumen ini, (dan pada masa ini
Devel::NYTProf nampaknya menjadi senjata pilihan - lihat di bawah), kita akan lihat sebentar
keluaran daripada Devel::DProf terlebih dahulu, untuk menetapkan garis dasar untuk alat pemprofilan Perl. Jalankan
program di atas di bawah kawalan "Devel::DProf" dengan menggunakan suis "-d" pada arahan-
line.

$> perl -d:DPof wordmatch -f perl5db.pl



laporan wordmatch untuk perl5db.pl:
baris dalam fail: 9428
perkataan dalam fail: 50243
perkataan dengan aksara khas (bukan perkataan): 20480
perkataan dengan hanya aksara khas (bukan perkataan): 7790
perkataan dengan konsonan sahaja: 4801
perkataan dengan huruf besar sahaja: 1316
perkataan dengan hanya vokal: 1701

"Devel::DProf" menghasilkan fail khas, dipanggil tmon.out secara lalai, dan fail ini dibaca
oleh program "dprofpp", yang telah dipasang sebagai sebahagian daripada "Devel::DProf"
pengedaran. Jika anda memanggil "dprofpp" tanpa pilihan, ia akan membaca tmon.out memfailkan di
direktori semasa dan menghasilkan laporan statistik yang boleh dibaca oleh manusia tentang larian anda
program. Ambil perhatian bahawa ini mungkin mengambil sedikit masa.

$> dprofpp

Jumlah Masa Berlalu = 2.951677 Saat
Masa Pengguna+Sistem = 2.871677 Saat
Masa Eksklusif
%Masa ExclSec CumulS #Panggilan saat/panggil Nama Csec/c
102. 2.945 3.003 251215 0.0000 0.0000 utama::perlawanan
2.40 0.069 0.069 260643 0.0000 0.0000 utama::nyahpepijat
1.74 0.050 0.050 1 0.0500 0.0500 utama::laporan
1.04 0.030 0.049 4 0.0075 0.0123 utama::MULA
0.35 0.010 0.010 3 0.0033 0.0033 Pengeksport::as_heavy
0.35 0.010 0.010 7 0.0014 0.0014 IO::Fail::MULA
0.00 - -0.000 1 - - Getopt::Long::FindOption
0.00 - -0.000 1 - - Simbol::MULA
0.00 - -0.000 1 - - Fcntl::MULA
0.00 - -0.000 1 - - Fcntl::bootstrap
0.00 - -0.000 1 - - amaran::MULA
0.00 - -0.000 1 - - IO::bootstrap
0.00 - -0.000 1 - - Getopt::Long::ConfigDefaults
0.00 - -0.000 1 - - Getopt::Long::Konfigurasikan
0.00 - -0.000 1 - - Simbol::gensym

"dprofpp" akan menghasilkan beberapa laporan yang agak terperinci mengenai aktiviti "wordmatch"
program. Jam dinding, pengguna dan sistem, masa berada di bahagian atas analisis, dan selepas
ini ialah lajur utama yang menentukan yang mentakrifkan laporan. Semak dokumen "dprofpp" untuk
butiran tentang banyak pilihan yang disokongnya.

Lihat juga "Apache::DProf" yang menghubungkan "Devel::DProf" ke "mod_perl".

Devel::Profiler
Mari lihat program yang sama menggunakan profiler yang berbeza: "Devel::Profiler", a
drop-in penggantian Perl sahaja untuk "Devel::DProf". Penggunaannya sangat sedikit berbeza dalam
daripada menggunakan bendera "-d:" khas, anda menarik "Devel::Profiler" secara langsung sebagai
modul menggunakan "-M".

$> perl -MDevel::Padanan kata profiler -f perl5db.pl



laporan wordmatch untuk perl5db.pl:
baris dalam fail: 9428
perkataan dalam fail: 50243
perkataan dengan aksara khas (bukan perkataan): 20480
perkataan dengan hanya aksara khas (bukan perkataan): 7790
perkataan dengan konsonan sahaja: 4801
perkataan dengan huruf besar sahaja: 1316
perkataan dengan hanya vokal: 1701

"Devel::Profiler" menjana fail tmon.out yang serasi dengan "dprofpp"
program, sekali gus menjimatkan pembinaan program pembaca statistik khusus. "dprofpp"
Oleh itu penggunaan adalah sama dengan contoh di atas.

$> dprofpp

Jumlah Masa Berlalu = 20.984 Saat
Masa Pengguna+Sistem = 19.981 Saat
Masa Eksklusif
%Masa ExclSec CumulS #Panggilan saat/panggil Nama Csec/c
49.0 9.792 14.509 251215 0.0000 0.0001 utama::perlawanan
24.4 4.887 4.887 260643 0.0000 0.0000 utama::nyahpepijat
0.25 0.049 0.049 1 0.0490 0.0490 utama::laporan
0.00 0.000 0.000 1 0.0000 0.0000 Getopt::Long::GetOptions
0.00 0.000 0.000 2 0.0000 0.0000 Getopt::Long::ParseOptionSpec
0.00 0.000 0.000 1 0.0000 0.0000 Getopt::Long::FindOption
0.00 0.000 0.000 1 0.0000 0.0000 IO::Fail::baru
0.00 0.000 0.000 1 0.0000 0.0000 IO::Penangan::baru
0.00 0.000 0.000 1 0.0000 0.0000 Simbol::gensym
0.00 0.000 0.000 1 0.0000 0.0000 IO::Fail::buka

Menariknya kami mendapat keputusan yang sedikit berbeza, yang kebanyakannya kerana algoritma
yang menjana laporan adalah berbeza, walaupun format fail output didakwa
sama. Masa berlalu, pengguna dan sistem jelas menunjukkan masa yang diambil
"Devel::Profiler" untuk melaksanakan lariannya sendiri, tetapi penyenaraian lajur berasa lebih tepat
entah bagaimana daripada yang kami ada sebelum ini daripada "Devel::DProf". Angka 102% mempunyai
hilang, contohnya. Di sinilah kita perlu menggunakan alatan yang ada pada kita, dan
mengenali kebaikan dan keburukan mereka, sebelum menggunakannya. Menariknya, nombor panggilan untuk
setiap subrutin adalah sama dalam dua laporan, peratusan yang berbeza. Sebagai
pengarang "Devel::Proviler" menulis:

...menjalankan HTML::Suit ujian Templat di bawah Devel::DPof menunjukkan output()
mengambil TIADA masa tetapi Devel::Profiler menunjukkan sekitar 10% masa berada dalam output().
Saya tidak tahu mana yang perlu dipercayai tetapi hati saya memberitahu saya ada sesuatu yang tidak kena
Devel::DPof. HTML::Template::output() ialah rutin besar yang diperlukan
setiap ujian. Walau apa pun, sesuatu perlu diperbaiki.

YMMV.

Lihat juga "Devel::Apache::Profiler" yang mengaitkan "Devel::Profiler" ke dalam "mod_perl".

Devel::SmallProf
Pemprofil "Devel::SmallProf" memeriksa masa jalan program Perl anda dan menghasilkan
penyenaraian baris demi baris untuk menunjukkan berapa kali setiap baris dipanggil dan berapa lama setiap baris
diambil untuk melaksanakan. Ia dipanggil dengan membekalkan bendera "-d" yang biasa kepada Perl semasa runtime.

$> perl -d:SmallProf wordmatch -f perl5db.pl



laporan wordmatch untuk perl5db.pl:
baris dalam fail: 9428
perkataan dalam fail: 50243
perkataan dengan aksara khas (bukan perkataan): 20480
perkataan dengan hanya aksara khas (bukan perkataan): 7790
perkataan dengan konsonan sahaja: 4801
perkataan dengan huruf besar sahaja: 1316
perkataan dengan hanya vokal: 1701

"Devel::SmallProf" menulis outputnya ke dalam fail yang dipanggil smallprof.out, secara lalai. The
format fail kelihatan seperti ini:

:

Apabila program telah ditamatkan, output boleh diperiksa dan diisih menggunakan mana-mana standard
utiliti penapisan teks. Sesuatu seperti berikut mungkin mencukupi:

$> kucing smallprof.out | grep \d*: | sort -k3 | tac | kepala -n20

251215 1.65674 7.68000 75: jika ($perkataan =~ /($regex)/ ) {
251215 0.03264 4.40000 79: nyahpepijat("perkataan: $i_wd ".($has ? 'match' :
251215 0.02693 4.10000 81: pulangan $has;
260643 0.02841 4.07000 128: jika ( $debug ) {
260643 0.02601 4.04000 126: my $message = shift;
251215 0.02641 3.91000 73: $has saya = 0;
251215 0.03311 3.71000 70: $i_wd saya = syif;
251215 0.02699 3.69000 72: my $regex = shift;
251215 0.02766 3.68000 71: $kata saya = anjakan;
50243 0.59726 1.00000 59: $count{$i_LINES}{cons} =
50243 0.48175 0.92000 61: $count{$i_LINES}{spec} =
50243 0.00644 0.89000 56: $i_cons = padanan($i_word, $word,
50243 0.48837 0.88000 63: $count{$i_LINES}{caps} =
50243 0.00516 0.88000 58: $i_caps = padanan($i_word, $word, '^[(A-
50243 0.00631 0.81000 54: $i_spec = padanan($i_word, $word, '[^a-
50243 0.00496 0.80000 57: $i_vows saya = padanan($i_word, $word,
50243 0.00688 0.80000 53: $i_word++;
50243 0.48469 0.79000 62: $count{$i_LINES}{only} =
50243 0.48928 0.77000 60: $count{$i_LINES}{vows} =

50243 0.00683 0.75000 55: $i_only = padanan($i_word, $word, '^[^a-
Anda boleh melihat fokus yang sedikit berbeza dengan serta-merta kepada modul pemprofilan subrutin,
dan kami mula melihat dengan tepat baris kod yang paling banyak mengambil masa. Baris regex itu
kelihatan agak mencurigakan, sebagai contoh. Ingat bahawa alat ini sepatutnya
digunakan bersama, tidak ada cara terbaik untuk memprofilkan kod anda, anda perlu menggunakan yang terbaik
alat untuk pekerjaan itu.

Lihat juga "Apache::SmallProf" yang mengaitkan "Devel::SmallProf" ke dalam "mod_perl".

Devel::FastProf
"Devel::FastProf" ialah satu lagi pemprofil baris Perl. Ini ditulis dengan tujuan untuk mendapatkan
pemprofil talian yang lebih pantas, daripada yang mungkin dengan contohnya "Devel::SmallProf", kerana ia
ditulis dalam "C". Untuk menggunakan "Devel::FastProf", berikan argumen "-d" kepada Perl:

$> perl -d:Padanan kata FastProf -f perl5db.pl



laporan wordmatch untuk perl5db.pl:
baris dalam fail: 9428
perkataan dalam fail: 50243
perkataan dengan aksara khas (bukan perkataan): 20480
perkataan dengan hanya aksara khas (bukan perkataan): 7790
perkataan dengan konsonan sahaja: 4801
perkataan dengan huruf besar sahaja: 1316
perkataan dengan hanya vokal: 1701

"Devel::FastProf" menulis statistik pada fail fastprof.out dalam direktori semasa.
Fail output, yang boleh ditentukan, boleh ditafsirkan dengan menggunakan "fprofpp"
program baris arahan.

$> fprofpp | kepala -n20

# format output fprofpp ialah:
# nama fail: kiraan masa talian: sumber
padanan perkataan:75 3.93338 251215: jika ($word =~ /($regex)/ ) {
wordmatch:79 1.77774 251215: debug("perkataan: $i_wd ".($mempunyai ? 'padanan' : 'tidak sepadan')." aksara: /$regex/");
padanan perkataan:81 1.47604 251215: pulangan $has;
wordmatch:126 1.43441 260643: my $message = shift;
wordmatch:128 1.42156 260643: if ($debug) {
wordmatch:70 1.36824 251215: my $i_wd = shift;
padanan perkataan:71 1.36739 251215: $perkataan saya = anjakan;
wordmatch:72 1.35939 251215: my $regex = shift;

Secara langsung kita dapat melihat bahawa bilangan kali setiap baris dipanggil adalah sama dengan
keluaran "Devel::SmallProf", dan urutannya hanya berbeza sedikit berdasarkan
susunan amaun masa yang diambil setiap baris untuk melaksanakan, "if ( $debug ) { " dan "my
$message = shift;", sebagai contoh. Perbezaan dalam masa sebenar yang direkodkan mungkin dalam
algoritma yang digunakan secara dalaman, atau ia mungkin disebabkan oleh had sumber sistem atau
perbalahan.

Lihat juga DBIx::Profile yang akan memprofilkan pertanyaan pangkalan data yang dijalankan di bawah "DBix::*"
ruang nama.

Devel::NYTProf
"Devel::NYTProf" ialah seterusnya generasi daripada pemprofil kod Perl, membetulkan banyak kelemahan
alatan lain dan melaksanakan banyak ciri hebat. Pertama sekali ia boleh digunakan sebagai sama ada a
selaras pemprofil, a menyekat atau subrutin profiler, sekaligus. Ia juga boleh menggunakan sub-
resolusi mikrosaat (100ns) pada sistem yang menyediakan "clock_gettime()". Ia boleh menjadi
dimulakan dan dihentikan walaupun oleh program yang diprofilkan. Ia adalah entri satu baris ke profil
aplikasi "mod_perl". Ia ditulis dalam "c" dan mungkin merupakan profiler terpantas
tersedia untuk Perl. Senarai kesejukan hanya berterusan. Cukup sekadar itu, mari kita lihat caranya
ia berfungsi - hanya gunakan suis "-d" yang biasa untuk memasangkannya dan menjalankan kod.

$> perl -d:NYTProf wordmatch -f perl5db.pl

laporan wordmatch untuk perl5db.pl:
baris dalam fail: 9427
perkataan dalam fail: 50243
perkataan dengan aksara khas (bukan perkataan): 20480
perkataan dengan hanya aksara khas (bukan perkataan): 7790
perkataan dengan konsonan sahaja: 4801
perkataan dengan huruf besar sahaja: 1316
perkataan dengan hanya vokal: 1701

"NYTProf" akan menjana pangkalan data laporan ke dalam fail nytprof.out secara lalai. Manusia
laporan boleh dibaca boleh dijana dari sini dengan menggunakan "nytprofhtml" yang dibekalkan (HTML
output) dan program "nytprofcsv" (CSV output). Kami telah menggunakan sistem Unix "html2text"
utiliti untuk menukar nytprof/index.html fail untuk kemudahan di sini.

$> html2text nytprof/index.html

Indeks Profil Prestasi
Untuk padanan kata
Dijalankan pada Jumaat 26 Sep 13:46:39 2008
Dilaporkan pada Fri Sep 26 13:47:23 2008

15 Subrutin Teratas -- dipesan mengikut masa eksklusif
|Panggilan |P |F |Inklusif|Eksklusif|Subrutin |
| | | |Masa |Masa | |
|251215|5 |1 |13.09263 |10.47692 |utama:: |perlawanan |
|260642|2 |1 |2.71199 |2.71199 |utama:: |nyahpepijat |
|1 |1 |1 |0.21404 |0.21404 |utama:: |laporan |
|2 |2 |2 |0.00511 |0.00511 |XSLoader:: |muat (xsub) |
|14 |14|7 |0.00304 |0.00298 |Pengeksport:: |import |
|3 |1 |1 |0.00265 |0.00254 |Pengeksport:: |sebagai_berat |
|10 |10|4 |0.00140 |0.00140 |var:: |import |
|13 |13|1 |0.00129 |0.00109 |malar:: |import |
|1 |1 |1 |0.00360 |0.00096 |FailHandle:: |import |
|3 |3 |3 |0.00086 |0.00074 |amaran::daftar::|import |
|9 |3 |1 |0.00036 |0.00036 |ketat:: |bit |
|13 |13|13|0.00032 |0.00029 |ketat:: |import |
|2 |2 |2 |0.00020 |0.00020 |amaran:: |import |
|2 |1 |1 |0.00020 |0.00020 |Getopt::Long:: |ParseOptionSpec|
|7 |7 |6 |0.00043 |0.00020 |ketat:: |nyahimport |

Untuk maklumat lanjut lihat senarai penuh 189 subrutin.

Bahagian pertama laporan sudah menunjukkan maklumat kritikal mengenainya
subrutin menggunakan paling banyak masa. Seterusnya memberikan beberapa statistik tentang sumber
fail diprofilkan.

Fail Kod Sumber -- dipesan mengikut masa eksklusif kemudian nama
|Stmts |Eksklusif|Purata. |Laporan |Fail Sumber |
| |Masa | | | |
|2699761|15.66654 |6e-06 |line . blok . sub|padanan kata |
|35 |0.02187 |0.00062|baris . blok . sub|IO/Handle.pm |
|274 |0.01525 |0.00006|baris . blok . sub|Getopt/Long.pm |
|20 |0.00585 |0.00029|baris . blok . sub|Fcntl.pm |
|128 |0.00340 |0.00003|baris . blok . sub|Pengeksport/Heavy.pm |
|42 |0.00332 |0.00008|baris . blok . sub|IO/Fail.pm |
|261 |0.00308 |0.00001|baris . blok . sub|Pengeksport.pm |
|323 |0.00248 |8e-06 |line . blok . sub|constant.pm |
|12 |0.00246 |0.00021|baris . blok . sub|Fail/Spesifikasi/Unix.pm |
|191 |0.00240 |0.00001|baris . blok . sub|vars.pm |
|77 |0.00201 |0.00003|baris . blok . sub|FileHandle.pm |
|12 |0.00198 |0.00016|baris . blok . sub|Carp.pm |
|14 |0.00175 |0.00013|baris . blok . sub|Simbol.pm |
|15 |0.00130 |0.00009|baris . blok . sub|IO.pm |
|22 |0.00120 |0.00005|baris . blok . sub|IO/Seekable.pm |
|198 |0.00085 |4e-06 |line . blok . sub|amaran/daftar.pm|
|114 |0.00080 |7e-06 |line . blok . sub|strict.pm |
|47 |0.00068 |0.00001|baris . blok . sub|amaran.pm |
|27 |0.00054 |0.00002|baris . blok . sub|overload.pm |
|9 |0.00047 |0.00005|baris . blok . sub|SelectSaver.pm |
|13 |0.00045 |0.00003|baris . blok . sub|Fail/Spec.pm |
|2701595|15.73869 | |Jumlah |
|128647 |0.74946 | |Purata |
| |0.00201 |0.00003|Median |
| |0.00121 |0.00003|Sisihan |

Laporan yang dihasilkan oleh NYTProf 2.03 Perl profiler, dibangunkan oleh Tim Bunce dan
Adam Kaplan.

Pada ketika ini, jika anda menggunakan html laporan, anda boleh mengklik melalui pelbagai pautan ke
ke dalam setiap subrutin dan setiap baris kod. Kerana kami menggunakan teks
melaporkan di sini, dan terdapat keseluruhan direktori yang penuh dengan laporan yang dibina untuk setiap fail sumber,
kami hanya akan memaparkan sebahagian daripada yang sepadan wordmatch-line.html fail, mencukupi untuk
berikan idea tentang jenis output yang anda boleh jangkakan daripada alat yang hebat ini.

$> html2text nytprof/wordmatch-line.html

Profil Prestasi -- -pandangan blok-.-pandangan baris-.-pandangan sub-
Untuk padanan kata
Dijalankan pada Jumaat 26 Sep 13:46:39 2008
Dilaporkan pada Fri Sep 26 13:47:22 2008

Padanan kata fail

Subrutin -- dipesan mengikut masa eksklusif
|Panggilan |P|F|Inklusif|Eksklusif|Subrutin |
| | | |Masa |Masa | |
|251215|5|1|13.09263 |10.47692 |main::|matches|
|260642|2|1|2.71199 |2.71199 |utama::|nyahpepijat |
|1 |1|1|0.21404 |0.21404 |utama::|laporan |
|0 |0|0|0 |0 |utama::|BERMULA |

|Baris|Stmts.|Eksklusif|Purata. |Kod |
| | |Masa | | |
|1 | | | |#!/usr/bin/perl |
|2 | | | | |
| | | | |gunakan ketat; |
|3 |3 |0.00086 |0.00029|# menghabiskan 0.00003s membuat 1 panggilan ke ketat:: |
| | | | |import |
| | | | |gunakan amaran; |
|4 |3 |0.01563 |0.00521|# menghabiskan 0.00012s membuat 1 panggilan ke amaran:: |
| | | | |import |
|5 | | | | |
|6 | | | |=head1 NAMA |
|7 | | | | |
|8 | | | |filewords - analisis perkataan fail input |

|62 |1 |0.00445 |0.00445|cetak laporan( %kira ); |
| | | | |# menghabiskan 0.21404s membuat 1 panggilan ke main::report|
|63 | | | | |
| | | | |# menghabiskan 23.56955s (10.47692+2.61571) dalam |
| | | | |utama::perlawanan yang dipanggil 251215 kali, |
| | | | |purata 0.00005s/panggilan: # 50243 kali |
| | | | |(2.12134+0.51939s) pada baris 57 padanan perkataan, purata|
| | | | |0.00005s/panggilan # 50243 kali (2.17735+0.54550s) |
|64 | | | |di baris 56 wordmatch, purata 0.00005s/panggilan # |
| | | | |50243 kali (2.10992+0.51797s) pada baris 58 daripada |
| | | | |wordmatch, purata 0.00005s/panggilan # 50243 kali |
| | | | |(2.12696+0.51598s) pada baris 55 padanan perkataan, purata|
| | | | |0.00005s/panggilan # 50243 kali (1.94134+0.51687s) |
| | | | |pada baris 54 wordmatch, purata 0.00005s/panggilan |
| | | | |sub padanan { |

|102 | | | | |
| | | | |# menghabiskan 2.71199s dalam main::debug iaitu |
| | | | |dipanggil 260642 kali, purata 0.00001s/panggilan: # |
| | | | |251215 kali (2.61571+0s) mengikut utama::perlawanan di |
|103 | | | |baris 74 padanan perkataan, purata 0.00001s/panggilan # 9427 |
| | | | |kali (0.09628+0s) pada baris 50 padanan perkataan, purata|
| | | | |0.00001s/panggilan |
| | | | |sub nyahpepijat { |
|104 |260642|0.58496 |2e-06 |my $message = shift; |
|105 | | | | |
|106 |260642|1.09917 |4e-06 |jika ( $debug ) { |
|107 | | | |cetak STDERR "DBG: $message\n"; |
|108 | | | |} |
|109 | | | |} |
|110 | | | | |
|111 |1 |0.01501 |0.01501|keluar 0; |
|112 | | | | |

Banyak maklumat yang sangat berguna di sana - ini nampaknya cara ke hadapan.

Lihat juga "Devel::NYTProf::Apache" yang mengaitkan "Devel::NYTProf" ke dalam "mod_perl".

MENYUSUN


Modul Perl bukan satu-satunya alat yang ada pada penganalisis prestasi, sistem
alat seperti "masa" tidak boleh diabaikan seperti yang ditunjukkan oleh contoh seterusnya, di mana kita mengambil a
cepat melihat menyusun. Banyak buku, tesis dan artikel, telah ditulis tentang cekap
menyusun algoritma, dan ini bukan tempat untuk mengulangi kerja sedemikian, terdapat beberapa kebaikan
menyusun modul yang patut dilihat juga: "Isih::Pembuat", "Isih::Kunci" musim bunga ke
fikiran. Walau bagaimanapun, masih boleh membuat beberapa pemerhatian pada Perl tertentu
tafsiran tentang isu yang berkaitan dengan menyusun set data dan memberi satu atau dua contoh dengan
mengambil kira bagaimana pengisihan volum data yang besar boleh mempengaruhi prestasi. Pertama, sering
titik terlepas pandang apabila menyusun sejumlah besar data, seseorang boleh cuba mengurangkan data
ditetapkan untuk ditangani dan dalam banyak kes "grep()" boleh menjadi sangat berguna sebagai penapis mudah:

@data = sort grep { /$filter/ } @incoming

Perintah seperti ini boleh mengurangkan jumlah bahan untuk benar-benar disusun
di tempat pertama, dan tidak boleh terlalu ringan diabaikan semata-mata berdasarkannya
kesederhanaan. Prinsip "KISS" terlalu kerap diabaikan - contoh seterusnya menggunakan
sistem mudah "masa" utiliti untuk menunjukkan. Mari kita lihat contoh sebenar
mengisih kandungan fail besar, fail log apache akan dilakukan. Yang ini mempunyai lebih daripada a
suku juta baris, bersaiz 50M, dan coretannya kelihatan seperti ini:

# fail log

188.209-65-87.adsl-dyn.isp.belgacom.be - - [08/Feb/2007:12:57:16 +0000] "DAPAT /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/ 4.0 (serasi; MSIE 6.0; Windows NT 5.1; SV1)"
188.209-65-87.adsl-dyn.isp.belgacom.be - - [08/Feb/2007:12:57:16 +0000] "DAPAT /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/ 4.0 (serasi; MSIE 6.0; Windows NT 5.1; SV1)"
151.56.71.198 - - [08/Feb/2007:12:57:41 +0000] "DAPATKAN /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
151.56.71.198 - - [08/Feb/2007:12:57:42 +0000] "DAPATKAN /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
151.56.71.198 - - [08/Feb/2007:12:57:43 +0000] "DAPATKAN /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en- AS; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
217.113.68.60 - - [08/Feb/2007:13:02:15 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1; SV1)"
217.113.68.60 - - [08/Feb/2007:13:02:16 +0000] "DAPATKAN /data/css HTTP/1.1" 404 206 "http://www.rfi.net/" "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1; SV1)"
debora.to.isac.cnr.it - ​​- [08/Feb/2007:13:03:58 +0000] "DAPATKAN /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/5.0 (serasi; Konqueror/3.4; Linux) KHTML/3.4.0 (seperti Gecko)"
debora.to.isac.cnr.it - ​​- [08/Feb/2007:13:03:58 +0000] "DAPATKAN /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/5.0 (serasi; Konqueror/3.4; Linux) KHTML/3.4.0 (seperti Gecko)"
debora.to.isac.cnr.it - ​​- [08/Feb/2007:13:03:58 +0000] "DAPATKAN /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (serasi; Konqueror/ 3.4; Linux) KHTML/3.4.0 (seperti Gecko)"
195.24.196.99 - - [08/Feb/2007:13:26:48 +0000] "GET / HTTP/1.0" 200 3309 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.9 .20061206) Gecko/1.5.0.9 Firefox/XNUMX"
195.24.196.99 - - [08/Feb/2007:13:26:58 +0000] "DAPATKAN /data/css HTTP/1.0" 404 206 "http://www.rfi.net/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9"
195.24.196.99 - - [08/Feb/2007:13:26:59 +0000] "DAPATKAN /favicon.ico HTTP/1.0" 404 209 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9"
crawl1.cosmixcorp.com - - [08/Feb/2007:13:27:57 +0000] "DAPATKAN /robots.txt HTTP/1.0" 200 179 "-" "voyager/1.0"
crawl1.cosmixcorp.com - - [08/Feb/2007:13:28:25 +0000] "DAPATKAN /links.html HTTP/1.0" 200 3413 "-" "voyager/1.0"
fhm226.internetdsl.tpnet.pl - - [08/Feb/2007:13:37:32 +0000] "DAPATKAN /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1; SV1)"
fhm226.internetdsl.tpnet.pl - - [08/Feb/2007:13:37:34 +0000] "DAPATKAN /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1; SV1)"
80.247.140.134 - - [08/Feb/2007:13:57:35 +0000] "GET / HTTP/1.1" 200 3309 "-" "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1 ; .NET CLR .1.1.4322)"
80.247.140.134 - - [08/Feb/2007:13:57:37 +0000] "DAPATKAN /data/css HTTP/1.1" 404 206 "http://www.rfi.net" "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"
pop.compuscan.co.za - - [08/Feb/2007:14:10:43 +0000] "GET / HTTP/1.1" 200 3309 "-" "www.clamav.net"
livebot-207-46-98-57.search.live.com - - [08/Feb/2007:14:12:04 +0000] "DAPATKAN /robots.txt HTTP/1.0" 200 179 "-" "msnbot/ 1.0 (+http://search.msn.com/msnbot.htm)"
livebot-207-46-98-57.search.live.com - - [08/Feb/2007:14:12:04 +0000] "DAPATKAN /html/oracle.html HTTP/1.0" 404 214 "-" " msnbot/1.0 (+http://search.msn.com/msnbot.htm)"
dslb-088-064-005-154.pools.arcor-ip.net - - [08/Feb/2007:14:12:15 +0000] "GET / HTTP/1.1" 200 3309 "-" "www.clamav .net"
196.201.92.41 - - [08/Feb/2007:14:15:01 +0000] "GET / HTTP/1.1" 200 3309 "-" "MOT-L7/08.B7.DCR MIB/2.2.1 Profile/MIDP -2.0 Konfigurasi/CLDC-1.1"

Tugas khusus di sini adalah untuk mengisih 286,525 baris fail ini mengikut Kod Respons, Pertanyaan,
Penyemak imbas, Url Rujuk, dan terakhir Tarikh. Satu penyelesaian mungkin menggunakan kod berikut,
yang berulang ke atas fail yang diberikan pada baris arahan.

# sort-apache-log

#!/usr/bin/perl -n

gunakan ketat;
gunakan amaran;

@data saya;

BARIS:
manakala ( <> ) {
$line saya = $_;
jika (
$line =~ m/^(
([\w\.\-]+) # pelanggan
\s*-\s*-\s*\[
([^]]+) # tarikh
\]\s*"\w+\s*
(\S+) # pertanyaan
[^"]+"\s*
(\d+) # status
\s+\S+\s+"[^"]*"\s+"
([^"]*) # penyemak imbas
"
.*
)$/x
) {
my @chunks = split(/ +/, $line);
$ip saya = $1;
$date saya = $2;
$query saya = $3;
$status saya = $4;
$pelayar saya = $5;

push(@data, [$ip, $date, $query, $status, $browser, $line]);
}
}

my @sorted = sort {
$a->[3] cmp $b->[3]
||
$a->[2] cmp $b->[2]
||
$a->[0] cmp $b->[0]
||
$a->[1] cmp $b->[1]
||
$a->[4] cmp $b->[4]
} @data;

foreach $data saya ( @sorted ) {
cetak $data->[5];
}

keluar 0;

Apabila menjalankan program ini, ubah hala "STDOUT" supaya anda boleh menyemak output
betul daripada menjalankan ujian berikut dan gunakan utiliti "masa" sistem untuk menyemak keseluruhannya
masa berjalan.

$> masa ./sort-apache-log logfile > out-sort

sebenar 0m17.371s
pengguna 0m15.757s
sys 0m0.592s

Program ini mengambil masa lebih 17 saat jam dinding untuk dijalankan. Perhatikan nilai "masa" yang berbeza
output, adalah penting untuk sentiasa menggunakan yang sama, dan untuk tidak mengelirukan apa yang setiap satu
bermakna.

Masa Nyata Berlalu
Keseluruhan, atau jam dinding, masa antara bila "masa" dipanggil dan bila masa itu
tamat. Masa berlalu termasuk masa pengguna dan sistem, dan masa yang dibelanjakan
menunggu pengguna dan proses lain pada sistem. Tidak dapat tidak, ini adalah yang paling
anggaran ukuran yang diberikan.

Masa CPU Pengguna
Masa pengguna ialah jumlah masa keseluruhan proses dibelanjakan bagi pihak pengguna
sistem ini melaksanakan program ini.

Masa CPU Sistem
Masa sistem ialah jumlah masa kernel itu sendiri menghabiskan melaksanakan rutin, atau
panggilan sistem, bagi pihak pengguna proses ini.

Menjalankan proses yang sama seperti "Schwarzian Transform" adalah mungkin untuk menghapuskan
tatasusunan input dan output untuk menyimpan semua data, dan bekerja pada input secara langsung kerana ia
tiba juga. Jika tidak, kod itu kelihatan agak serupa:

# sort-apache-log-schwarzian

#!/usr/bin/perl -n

gunakan ketat;
gunakan amaran;

cetak

peta $_->[0] =>

jenis {
$a->[4] cmp $b->[4]
||
$a->[3] cmp $b->[3]
||
$a->[1] cmp $b->[1]
||
$a->[2] cmp $b->[2]
||
$a->[5] cmp $b->[5]
}
peta [ $_, m/^(
([\w\.\-]+) # pelanggan
\s*-\s*-\s*\[
([^]]+) # tarikh
\]\s*"\w+\s*
(\S+) # pertanyaan
[^"]+"\s*
(\d+) # status
\s+\S+\s+"[^"]*"\s+"
([^"]*) # penyemak imbas
"
.*
)$/xo ]

=> <>;

keluar 0;

Jalankan kod baharu terhadap fail log yang sama, seperti di atas, untuk menyemak masa baharu.

$> masa ./sort-apache-log-schwarzian logfile > out-schwarz

sebenar 0m9.664s
pengguna 0m8.873s
sys 0m0.704s

Masa telah dipotong separuh, yang merupakan peningkatan kelajuan yang dihormati oleh mana-mana standard.
Sememangnya, adalah penting untuk menyemak output adalah konsisten dengan program pertama yang dijalankan,
di sinilah utiliti "cksum" sistem Unix masuk.

$> cksum out-sort out-schwarz
3044173777 52029194 out-sort
3044173777 52029194 out-schwarz

BTW. Berhati-hati juga dengan tekanan daripada pengurus yang melihat anda mempercepatkan program sebanyak 50% daripadanya
runtime sekali, hanya untuk mendapatkan permintaan sebulan kemudian untuk melakukan perkara yang sama sekali lagi (kisah benar) -
anda hanya perlu menunjukkan bahawa anda hanya manusia, walaupun anda seorang pengaturcara Perl, dan
anda akan lihat apa yang anda boleh lakukan...

MASUK


Bahagian penting mana-mana proses pembangunan yang baik adalah pengendalian ralat yang sesuai dengannya
mesej bermaklumat yang sewajarnya, namun terdapat satu aliran pemikiran yang
mencadangkan bahawa fail log sepatutnya cerewet, seolah-olah rantaian keluaran tidak terputus entah bagaimana
memastikan kelangsungan program. Jika kelajuan dalam apa-apa cara adalah isu, pendekatan ini adalah
salah.

Pemandangan biasa ialah kod yang kelihatan seperti ini:

logger->debug( "Mesej pengelogan melalui process-id: $$ INC: " . Dumper(\%INC) )

Masalahnya ialah kod ini akan sentiasa dihuraikan dan dilaksanakan, walaupun semasa nyahpepijat
tahap yang ditetapkan dalam fail konfigurasi pengelogan adalah sifar. Sebaik sahaja nyahpepijat() subrutin telah
dimasukkan, dan pembolehubah $debug dalaman disahkan menjadi sifar, sebagai contoh, mesej
yang telah dihantar akan dibuang dan program akan diteruskan. Dalam contoh
walaupun diberikan, cincangan "\%INC" sudah pun dibuang dan rentetan mesej
dibina, semua kerja yang boleh dipintas oleh pembolehubah nyahpepijat pada pernyataan
peringkat, seperti ini:

logger->debug( "Mesej pengelogan melalui process-id: $$ INC: " . Dumper(\%INC) ) jika $DEBUG;

Kesan ini boleh ditunjukkan dengan menyediakan skrip ujian dengan kedua-dua borang, termasuk a
"debug()" subrutin untuk meniru kefungsian "logger()" biasa.

# ifdebug

#!/usr/bin/perl

gunakan ketat;
gunakan amaran;

gunakan Penanda Aras;
gunakan Data:: Dumper;
$DEBUG saya = 0;

sub nyahpepijat {
$msg saya = shift;

jika ( $DEBUG ) {
cetak "DEBUG: $msg\n";
}
};

timethese(100000, {
'debug' => sub {
debug( "Mesej pengelogan $0 melalui process-id: $$" . Dumper(\%INC) )
},
'ifdebug' => sub {
debug( "Mesej pengelogan $0 melalui process-id: $$" . Dumper(\%INC) ) jika $DEBUG
},
});

Mari lihat apa yang dibuat oleh "Tanda Aras" tentang ini:

$> perl ifdebug
Penanda aras: pemasaan 100000 lelaran pemalar, sub...
ifdebug: 0 jam dinding saat ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 10000000.00/s (n=100000)
(amaran: terlalu sedikit lelaran untuk kiraan yang boleh dipercayai)
nyahpepijat: 14 saat jam dinding (13.18 usr + 0.04 sys = 13.22 CPU) @ 7564.30/s (n=100000)

Dalam satu kes kod, yang melakukan perkara yang sama setakat mengeluarkan mana-mana
maklumat penyahpepijatan berkenaan, dengan kata lain tiada apa-apa, mengambil masa 14 saat, dan dalam
kes lain kod mengambil masa seperseratus saat. Nampak agak muktamad. Gunakan a
Pembolehubah $DEBUG SEBELUM anda memanggil subrutin, dan bukannya bergantung pada pintar
fungsi di dalamnya.

Pembalakan if HUTANG (malar)
Ia mungkin untuk mengambil idea sebelumnya sedikit lebih jauh, dengan menggunakan masa kompilasi "DEBUG"
pemalar.

# ifdebug-constant

#!/usr/bin/perl

gunakan ketat;
gunakan amaran;

gunakan Penanda Aras;
gunakan Data:: Dumper;
gunakan pemalar
DEBUG => 0
;

sub nyahpepijat {
jika ( DEBUG ) {
$msg saya = shift;
cetak "DEBUG: $msg\n";
}
};

timethese(100000, {
'debug' => sub {
debug( "Mesej pengelogan $0 melalui process-id: $$" . Dumper(\%INC) )
},
'constant' => sub {
debug( "Mesej pengelogan $0 melalui process-id: $$" . Dumper(\%INC) ) jika DEBUG
},
});

Menjalankan program ini menghasilkan output berikut:

$> perl ifdebug-constant
Penanda aras: pemasaan 100000 lelaran pemalar, sub...
pemalar: 0 jam dinding saat (-0.00 usr + 0.00 sys = -0.00 CPU) @ -7205759403792793600000.00/s (n=100000)
(amaran: terlalu sedikit lelaran untuk kiraan yang boleh dipercayai)
sub: 14 saat jam dinding (13.09 usr + 0.00 sys = 13.09 CPU) @ 7639.42/s (n=100000)

Pemalar "DEBUG" mengelap lantai dengan walaupun pembolehubah $debug, mencatatkan pada tolak
sifar saat, dan menjana mesej "amaran: terlalu sedikit lelaran untuk kiraan yang boleh dipercayai".
ke dalam tawar-menawar. Untuk melihat apa yang sebenarnya berlaku, dan mengapa kami mempunyai terlalu sedikit lelaran apabila
kami fikir kami meminta 100000, kami boleh menggunakan "B::Deparse" yang sangat berguna untuk memeriksa yang baharu
kod:

$> perl -MO=Berhenti ifdebug-constant

gunakan Penanda Aras;
gunakan Data:: Dumper;
gunakan pemalar ('DEBUG', 0);
sub nyahpepijat {
gunakan amaran;
gunakan 'ref' yang ketat;
0;
}
gunakan amaran;
gunakan 'ref' yang ketat;
timethese(100000, {'sub', sub {
nyahpepijat "Mesej pengelogan $0 melalui process-id: $$" . Dumper(\%INC);
}
, 'malar', sub {
0;
}
});
sintaks ifdebug-constant OK

Output menunjukkan malar() subrutin yang kami uji digantikan dengan nilai
pemalar "DEBUG": sifar. Barisan yang akan diuji telah dioptimumkan sepenuhnya, dan
anda tidak boleh mendapatkan lebih cekap daripada itu.

POSTSKRIP


Dokumen ini telah menyediakan beberapa cara untuk mengenal pasti titik panas dan menyemak
sama ada sebarang pengubahsuaian telah meningkatkan masa jalan kod.

Sebagai pemikiran terakhir, ingat bahawa tidak mungkin (pada masa penulisan) menghasilkan a
program berguna yang akan berjalan dalam masa sifar atau negatif dan prinsip asas ini boleh
ditulis sebagai: berguna program adalah memperlahankan mengikut definisi mereka. Ia sudah tentu boleh
untuk menulis program yang hampir serta-merta, tetapi ia tidak akan melakukan banyak perkara, inilah yang sangat
yang cekap:

$> perl -e 0

Mengoptimumkan bahawa apa-apa lagi adalah tugas untuk "p5p".

Gunakan perlperf dalam talian menggunakan perkhidmatan onworks.net


Pelayan & Stesen Kerja Percuma

Muat turun apl Windows & Linux

Arahan Linux

Ad