Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen perlperf komutudur.
Program:
ADI
perlperf - Perl Performans ve Optimizasyon Teknikleri
TANIM
Bu, performans ve optimizasyon tekniklerinin kullanımına bir giriştir.
özellikle perl programlarına atıfta bulunularak kullanılır. Birçok Perl geliştiricisi gelmişken
diğer dillerden ve uygun olduğunda ön bilgilerini kullanabilirler, birçok
Perl'e özgü birkaç işaretçiden yararlanabilecek diğer insanlar. eğer istersen
özet versiyonu, belki de en iyi tavsiye ünlü Japon Samuray'dan geliyor,
Miyamoto Musashi, şunları söyledi:
"Gereksiz Faaliyetlerde Bulunmayın"
1645 içinde.
GENEL BAKIŞ
Belki de programcıların yaptığı en yaygın hata, kodlarını optimize etmeye çalışmaktır.
bir program gerçekten yararlı bir şey yapmadan önce - bu kötü bir fikir. Burada mantık yok
çalışmayan son derece hızlı bir programa sahip olmak. İlk iş bir program almaktır.
doğru bir şey yap işe yarar, (test paketinin tamamen
işlevsel) ve ancak o zaman optimize etmeyi düşünün. Mevcut olanı optimize etmeye karar verdikten sonra
çalışma kodu, içsel olan dikkate alınması gereken birkaç basit ama önemli adım vardır.
herhangi bir optimizasyon işlemine
ONE STEP YAN YAN
İlk olarak, mevcut kod için zamanlamanın ihtiyaç duyduğu bir temel zaman belirlemeniz gerekir.
güvenilir ve tekrarlanabilir olmak. Muhtemelen "Karşılaştırmayı" kullanmak isteyeceksiniz veya
Bu adım için "Devel::NYTPrf" modülleri veya benzeri bir şey veya belki de Unix sistemi
"zaman" yardımcı programı, hangisi uygunsa. Daha uzun bir liste için bu belgenin temeline bakın
kıyaslama ve profil oluşturma modülleri ve daha fazla okuma önerilir.
ONE STEP İLERİ
Daha sonra, programı inceledikten sonra Sıcak noktalar, (kodun çalıştığı görünen yerler
yavaşça), daha hızlı çalışmasını sağlamak amacıyla kodu değiştirin. sürümü kullanma
"Subversion" gibi kontrol yazılımı, hiçbir değişikliğin geri alınamaz olmasını sağlayacaktır. Bu çok
burada keman çalmak ve orada keman çalmak kolaydır - herhangi bir anda çok fazla değişiklik yapmayın, aksi takdirde
hangi kod parçasını keşfetmemek Gerçekten mi yavaş olan kısımdı.
BAŞKA STEP YAN YAN
"Bu daha hızlı çalışmasını sağlar" demek yetmez, kontrol etmeniz gerekir. yeniden çalıştırın
Yukarıdaki ilk adımdan itibaren kıyaslama veya profil oluşturma modüllerinin kontrolü altındaki kod,
ve yeni kodun yürüttüğünü kontrol edin. aynı görev in az zaman. Çalışmanızı kaydedin ve
tekrarlamak...
GENEL KILAVUZ
Performansı değerlendirirken kritik olan şey, performans diye bir şeyin olmadığını hatırlamaktır.
"Altın Mermi", bu yüzden kural yoktur, yalnızca yönergeler vardır.
Satır içi kodun alt program veya yöntem çağrılarından daha hızlı olacağı açıktır,
çünkü daha az ek yük vardır, ancak bu yaklaşımın daha az olması dezavantajı vardır.
bakımı yapılabilir ve daha fazla bellek kullanımı pahasına gelir - diye bir şey yoktur
ücretsiz öğle yemeği. Bir listede bir eleman arıyorsanız, bunu yapmak daha verimli olabilir.
verileri bir karma yapıda depolayın ve ardından anahtarın olup olmadığına bakın.
kullanarak tüm dizide dolaşmak yerine tanımlanmış grep() Örneğin. alt dizi ()
(çok) daha hızlı olabilir grep() ama o kadar esnek değil, bu yüzden başka bir takasınız var
erişim. Kodunuz, yürütülmesi 0.01 saniye süren bir satır içerebilir;
1,000 kez arayın, büyük olasılıkla orta büyüklükteki dosyaları bile ayrıştıran bir programda
örneğin, yalnızca tek bir kod konumunda zaten 10 saniyelik bir gecikmeniz var ve
bu hattı 100,000 kez ararsanız, tüm programınız yavaşlayacak ve dayanılmaz bir tarama yapacaktır.
Sıralamanızın bir parçası olarak bir alt yordam kullanmak, tam olarak istediğinizi elde etmenin güçlü bir yoludur.
ancak genellikle yerleşik olandan daha yavaş olacaktır alfabetik "cmp" ve sayısal "<=>" sıralama
operatörler. Verileriniz üzerinde birden fazla geçiş yapmak, endeksler oluşturmak mümkündür.
yaklaşan sıralamayı daha verimli hale getirmek ve "OM" (Orcish) olarak bilinen şeyi kullanmak
Manevra) sıralama anahtarlarını önceden önbelleğe almak için. Önbellek araması iyi bir fikir olsa da
veriler üzerinde çift geçişi zorunlu kılarak kendisi bir yavaşlama kaynağı olabilir - bir kez kurulum için
önbellek ve verileri sıralamak için bir kez. Gerekli sıralama anahtarını çıkarmak için "pack()" kullanma
tutarlı bir dizeye dönüştürmek, karşılaştırmak için tek bir dize oluşturmanın etkili bir yolu olabilir,
yazılı standart kullanmayı mümkün kılan birden çok sıralama anahtarı kullanmak yerine
"c" ve hızlı, çıktıda perl "sort()" işlevi ve "GRT" temelidir
(Guttman Rossler Dönüşümü). Bazı dizi kombinasyonları "GRT"yi yavaşlatabilir.
kendi iyiliği için çok basit karmaşık olmak.
Veritabanı arka uçlarını kullanan uygulamalar için standart "DBIx" ad alanı yardımcı olmaya çalışır.
işleri nippy tutmakla, en azından denemeye çalıştığı için değil kadar veritabanını sorgulayın
mümkün olan en son an, ancak her zaman kitaplık seçiminizle birlikte gelen belgeleri okuyun.
Veritabanlarıyla uğraşan geliştiricilerin karşı karşıya olduğu birçok sorundan biri de şudur:
her zaman "SQL" yer tutucularını kullanmak ve bu mümkün olduğunda veri kümelerini önceden getirmeyi düşünmek
avantajlı olduğunu kanıtlayın. Ayrıştırmaya birden çok işlem atayarak büyük bir dosyayı bölme
"POE", "threads" veya "fork" kelimelerini kullanan tek bir dosya da optimizasyon için yararlı bir yol olabilir.
bu teknikle dolu olsa da, mevcut "CPU" kaynaklarını kullanımınız
eşzamanlılık sorunları ve ayrıntılara yüksek dikkat gerektirir.
Her vakanın belirli bir uygulaması ve bir veya daha fazla istisnası vardır ve herhangi bir istisna yoktur.
birkaç test yapmak ve sizin için en uygun yöntemi bulmak yerine
belirli bir ortam, bu yüzden optimal kod yazma kesin bir bilim değildir ve neden
Perl'i kullanmayı çok seviyoruz - TMTOWTDI.
ÖLÇÜTLERİ
Perl'in kıyaslama araçlarının kullanımını göstermek için birkaç örnek.
atama ve Başvurudan çıkarma Değişkenler.
Eminim çoğumuz şuna benzeyen (veya bundan daha kötü) bir kod görmüşüzdür:
if ( $obj->{_ref}->{_myscore} >= $obj->{_ref}->{_yourscore} ) {
Kendi ID’n ile mağazalarını oluştur
Bu tür bir kod, yazım hatalarına karşı çok hassas olmanın yanı sıra, okunması gerçekten göze batan bir kod olabilir.
ve değişkeni açıkça iptal etmek çok daha açıktır. yan adım atıyoruz
değişkeni kapsüllemek için nesne yönelimli programlama teknikleriyle çalışma sorunu
yöntemlerle erişim, yalnızca bir nesne aracılığıyla erişilebilir. Burada sadece tartışıyoruz
seçimin teknik uygulaması ve bunun performans üzerinde bir etkisi olup olmadığı. Yapabiliriz
karşılaştırmalı kod koyarak bu referans kaldırma işleminin herhangi bir ek yükü olup olmadığını görün
bir dosya ve bir "Karşılaştırma" testi çalıştırıyor.
# referans
#!/usr/bin/Perl
sıkı kullanın;
uyarıları kullan;
Benchmark'ı kullanın;
benim $başvurum = {
'başvuru' => {
_myscore => '100 + 1',
_skorunuz => '102 - 1',
},
};
zamanbunlar(1000000, {
'doğrudan' => alt {
benim $x = $ref->{ref}->{_myscore} . $ref->{ref}->{_yourscore} ;
},
'referans' => alt {
benim $başvurum = $başvurum->{ref};
benim $myscore = $ref->{_myscore};
benim $skorunuz = $ref->{_yourscore};
benim $x = $myscore . $skorunuz;
},
});
Herhangi bir zamanlama ölçümünü yeterli sayıda çalıştırmak önemlidir, böylece sayılar
sayısal bir ortalamaya oturun, aksi takdirde her çalışma, aşağıdakilerden dolayı doğal olarak dalgalanacaktır.
ortamdaki değişiklikler, "CPU" kaynakları için çekişmenin etkisini azaltmak ve
örneğin ağ bant genişliği. Yukarıdaki kodu bir milyon yineleme için çalıştırarak şunları yapabiliriz:
Hangi yaklaşımın uygun olduğunu görmek için "Benchmark" modülünün rapor çıktısına bakın.
en etkili.
$> perl referansı
Kıyaslama: 1000000 referans yinelemesinin zamanlaması, doğrudan...
referans: 2 duvar saati saniye (1.59 usr + 0.00 sys = 1.59 CPU) @ 628930.82/s (n=1000000)
doğrudan: 1 duvar saati saniye (1.20 usr + 0.00 sys = 1.20 CPU) @ 833333.33/s (n=1000000)
Farkı görmek açıktır ve referans kaldırma yaklaşımı daha yavaştır. Yönetirken
testimiz sırasında saniyede ortalama 628,930 kez yürütmek için doğrudan yaklaşım
ne yazık ki 204,403 kez daha çalıştırmayı başardı. Maalesef var çünkü
çok katmanlı doğrudan değişken erişimi kullanılarak yazılmış birçok kod örneğidir ve
genellikle korkunçtur. Ancak az da olsa daha hızlıdır. soru kalır mı
dakika kazancı aslında göz yorgunluğuna veya sürdürülebilirlik kaybına değer.
Ara ve değiştirmek or tr
Değiştirilmesi gereken bir dizgimiz varsa, bir normal ifade neredeyse her zaman çok olacaktır.
daha esnek, genellikle az kullanılan bir araç olan "tr" yine de yararlı olabilir. Bir senaryo olabilir
tüm sesli harfleri başka bir karakterle değiştirin. Normal ifade çözümü şöyle görünebilir:
$str =~ s/[aeiou]/x/g
"tr" alternatifi şöyle görünebilir:
$str =~ tr/aeiou//
Bunu, hangi yaklaşımın en hızlı olduğunu kontrol etmek için çalıştırabileceğimiz bir test dosyasına koyabiliriz,
perl'den kaçınmak için "my $str" değişkenine atamak için global bir $STR değişkeni kullanma
yalnızca bir kez atandığını fark ederek herhangi bir işi optimize etmeye çalışmak.
# normal ifade-harf çevirisi
#!/usr/bin/Perl
sıkı kullanın;
uyarıları kullan;
Benchmark'ı kullanın;
benim $STR = "$$-bu ve bu";
zamanbunlar( 1000000, {
'sr' => sub { benim $str = $STR; $str =~ s/[aeiou]/x/g; $str döndür; },
'tr' => sub { benim $str = $STR; $str =~ tr/aeiou//; $str döndür; },
});
Kodu çalıştırmak bize sonuçlarımızı verir:
$> perl normal ifade-harf çevirisi
Karşılaştırma: sr, tr için 1000000 yineleme zamanlaması...
sr: 2 duvar saati saniye (1.19 usr + 0.00 sys = 1.19 CPU) @ 840336.13/sn (n=1000000)
tr: 0 duvar saati saniye (0.49 usr + 0.00 sys = 0.49 CPU) @ 2040816.33/s (n=1000000)
"tr" versiyonu net bir kazanan. Çözümlerden biri esnek, diğeri hızlı - ve
hangisini kullanacağı uygun şekilde programcının seçimidir.
Daha fazla yararlı teknik için "Karşılaştırma" belgelerine bakın.
PROFİL ARAÇLAR
Biraz daha büyük bir kod parçası, bir profil oluşturucunun üzerinde üretebileceği bir şey sağlayacaktır.
daha kapsamlı raporlama istatistikleri. Bu örnek, basit "kelime eşleme" programını kullanır
belirli bir girdi dosyasını ayrıştırır ve içerik hakkında kısa bir rapor yayar.
# kelime eşleşmesi
#!/usr/bin/Perl
sıkı kullanın;
uyarıları kullan;
=kafa1 ADI
filewords - girdi dosyasının kelime analizi
=kafa1 ÖZET
dosya sözcükleri -f girdidosya adı [-d]
= head1 DESCRIPTION
Bu program, C<-f> ile belirtilen verilen dosya adını ayrıştırır ve bir
orada bulunan kelimelerin basit bir analizi. etkinleştirmek için C<-d> anahtarını kullanın.
hata ayıklama mesajları.
= kes
FileHandle'ı kullanın;
Getopt::Long'u kullanın;
benim $debug = 0;
benim $dosyam = '';
benim $sonucum = GetOptions (
'hata ayıklama' => \$hata ayıklama,
'dosya=s' => \$dosya,
);
$sonuç olmadığı sürece die("geçersiz argümanlar");
sürece ( -f $dosya ) {
die("Kullanım: $0 -f dosya adı [-d]");
}
benim $FH = FileHandle->new("< $file") or die("dosya açılamıyor($file): $!");
benim $i_LINES = 0;
benim $i_WORDS = 0;
benim %sayım = ();
@lines = <$FH>;
foreach $line ( @lines ) {
$i_LINES++;
$satır =~ s/\n//;
@kelimelerim = böl(/ +/, $satır);
benim $i_words = skaler(@words);
$i_WORDS = $i_WORDS + $i_words;
debug("satır: $i_LINES $i_words kelime sağlıyor: @words");
benim $i_word = 0;
foreach $word ( @words ) {
$i_word++;
$count{$i_LINES}{spec} += eşleşmeler($i_word, $word, '[^a-zA-Z0-9]');
$count{$i_LINES}{yalnızca} += eşleşmeler($i_word, $word, '^[^a-zA-Z0-9]+$');
$count{$i_LINES}{cons} += eşleşmeler($i_word, $word, '^[(?i:bcdfghjklmnpqrstvwxyz)]+$');
$count{$i_LINES}{yeminler} += eşleşmeler($i_word, $word, '^[(?i:aeiou)]+$');
$count{$i_LINES}{caps} += eşleşmeler($i_word, $word, '^[(AZ)]+$');
}
}
raporu yazdır( %count );
alt eşleşmeler {
benim $i_wd = vardiyam;
benim $kelime = vardiya;
benim $regex = shift;
benim $var = 0;
if ( $kelime =~ /($regex)/ ) {
1$ ise $vardır++;
}
debug("kelime: $i_wd ".($var? 'eşleşiyor': 'eşleşmiyor')." karakter: /$regex/");
dönüş $has;
}
alt rapor {
%raporum = @_;
benim %rep'im;
foreach $line ( anahtarlar %report ) {
foreach $key ( anahtarlar %{ $report{$line} } ) {
$rep{$anahtar} += $rapor{$satır}{$anahtar};
}
}
benim $raporum = qq|
$file için $0 raporu:
dosyadaki satırlar: $i_LINES
dosyadaki kelimeler: $i_WORDS
özel (kelime olmayan) karakterlere sahip kelimeler: $i_spec
sadece özel (kelime olmayan) karakterler içeren kelimeler: $i_only
sadece ünsüzleri olan kelimeler: $i_cons
sadece büyük harfli kelimeler: $i_caps
sadece sesli harfler içeren kelimeler: $i_vows
|;
$ raporu döndür;
}
alt hata ayıklama {
$mesajım = vardiya;
if ( $hata ayıklama ) {
print STDERR "DBG: $mesaj\n";
}
}
çıkış 0;
Geliştirme::DProf
Bu saygıdeğer modül, Perl kod profili oluşturma için fiili standart olmuştur.
on yıl, ancak bizi geri getiren bir dizi başka modülle değiştirildi.
21. yüzyıl. Aracınızı çeşitli seçeneklerden değerlendirmeniz tavsiye edilse de
burada belirtilen ve bu belgenin temelindeki CPAN listesinden (ve şu anda
Devel::NYTPrf tercih edilen silah gibi görünüyor - aşağıya bakın), kısaca göz atacağız
Perl profil oluşturma araçları için bir temel belirlemek için önce Devel::DProf'tan çıktı. Çalıştır
Yukarıdaki program, komuttaki "-d" anahtarını kullanarak "Devel::DPrf" kontrolü altında-
hattı.
$> perl -d:DProf kelime eşleme -f perl5db.pl
<...birden çok satır kesildi...>
perl5db.pl için kelime eşleme raporu:
dosyadaki satırlar: 9428
dosyadaki kelimeler: 50243
özel (kelime olmayan) karakterli kelimeler: 20480
sadece özel (kelime olmayan) karakterler içeren kelimeler: 7790
sadece ünsüzleri olan kelimeler: 4801
sadece büyük harfli kelimeler: 1316
sadece sesli harfli kelimeler: 1701
"Devel::DPrf" adlı özel bir dosya üretir. tmon.out varsayılan olarak ve bu dosya okunur
"Devel::DProf"un bir parçası olarak zaten kurulmuş olan "dprofpp" programı tarafından
dağıtım. Seçenek olmadan "dprofpp" öğesini çağırırsanız, okuyacaktır. tmon.out dosya
geçerli dizini seçin ve çalışmanızın insan tarafından okunabilir bir istatistik raporu oluşturun.
programı. Bunun biraz zaman alabileceğini unutmayın.
$> dprofpp
Toplam Geçen Süre = 2.951677 Saniye
Kullanıcı+Sistem Süresi = 2.871677 Saniye
Özel Zamanlar
%Zaman HariçSn KümülS #Çağrı sn/çağrı Csec/c Ad
102. 2.945 3.003 251215 0.0000 0.0000 ana::eşleşmeler
2.40 0.069 0.069 260643 0.0000 0.0000 ana::hata ayıklama
1.74 0.050 0.050 1 0.0500 0.0500 ana::rapor
1.04 0.030 0.049 4 0.0075 0.0123 ana::BAŞLA
0.35 0.010 0.010 3 0.0033 0.0033 İhracatçı::as_heavy
0.35 0.010 0.010 7 0.0014 0.0014 IO::File::BEGIN
0.00 - -0.000 1 - - Getopt::Long::FindOption
0.00 - -0.000 1 - - Symbol::BEGIN
0.00 - -0.000 1 - - Fcntl::BEGIN
0.00 - -0.000 1 - - Fcntl::bootstrap
0.00 - -0.000 1 - - uyarılar::BEGIN
0.00 - -0.000 1 - - IO::bootstrap
0.00 - -0.000 1 - - Getopt::Long::ConfigDefaults
0.00 - -0.000 1 - - Getopt::Long::Configure
0.00 - -0.000 1 - - Symbol::gensym
"dprofpp", "kelime eşleme" etkinliği hakkında oldukça ayrıntılı raporlar üretecektir.
programı. Duvar saati, kullanıcı ve sistem, zamanlar analizin en üstünde ve sonrasında
bu, raporu tanımlayan ana sütunlardır. için "dprofpp" belgelerini kontrol edin.
desteklediği birçok seçeneğin ayrıntıları.
"Devel::DProf"u "mod_perl"e bağlayan "Apache::DPrf" bölümüne de bakın.
Geliştirme:: Profil Oluşturucu
Farklı bir profil oluşturucu kullanarak aynı programa bir göz atalım: "Devel::Profiler", bir
"Devel::DProf" için yalnızca Perl'e özel değiştirme. Kullanım çok az farklı
özel "-d:" bayrağını kullanmak yerine, "Devel::Profiler" öğesini doğrudan bir
"-M" kullanarak modül.
$> perl -MDevel::Profiler kelime eşleme -f perl5db.pl
<...birden çok satır kesildi...>
perl5db.pl için kelime eşleme raporu:
dosyadaki satırlar: 9428
dosyadaki kelimeler: 50243
özel (kelime olmayan) karakterli kelimeler: 20480
sadece özel (kelime olmayan) karakterler içeren kelimeler: 7790
sadece ünsüzleri olan kelimeler: 4801
sadece büyük harfli kelimeler: 1316
sadece sesli harfli kelimeler: 1701
"Devel::Profiler", "dprofpp" ile uyumlu bir tmon.out dosyası oluşturur.
programı, böylece özel bir istatistik okuyucu programının yapımından tasarruf sağlar. "dprofp"
kullanım bu nedenle yukarıdaki örnekle aynıdır.
$> dprofpp
Toplam Geçen Süre = 20.984 Saniye
Kullanıcı+Sistem Süresi = 19.981 Saniye
Özel Zamanlar
%Zaman HariçSn KümülS #Çağrı sn/çağrı Csec/c Ad
49.0 9.792 14.509 251215 0.0000 0.0001 ana::eşleşmeler
24.4 4.887 4.887 260643 0.0000 0.0000 ana::hata ayıklama
0.25 0.049 0.049 1 0.0490 0.0490 ana::rapor
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::Dosya::yeni
0.00 0.000 0.000 1 0.0000 0.0000 IO::Tutamak::yeni
0.00 0.000 0.000 1 0.0000 0.0000 Symbol::gensym
0.00 0.000 0.000 1 0.0000 0.0000 GÇ::Dosya::aç
İlginç bir şekilde, biraz farklı sonuçlar elde ediyoruz, bunun nedeni çoğunlukla algoritma
çıktı dosyası biçiminin iddia edildiği gibi olmasına rağmen, raporu oluşturan farklıdır.
özdeş. Geçen, kullanıcı ve sistem süreleri, bunun için geçen süreyi açıkça gösteriyor.
"Devel::Profiler" kendi çalışmasını yürütmek için, ancak sütun listeleri daha doğru görünüyor
bir şekilde "Devel::DProf"tan daha önce sahip olduklarımızdan daha fazla. %102 rakamı var
örneğin kayboldu. Elimizdeki araçları kullanmamız gereken yer burasıdır ve
kullanmadan önce artılarını ve eksilerini tanıyın. İlginç bir şekilde, aramaların sayısı
her bir alt program iki raporda aynıdır, farklı olan yüzdelerdir. Olarak
"Devel::Proviler" yazarı şöyle yazıyor:
...HTML::Template'in Devel::DProf altındaki test takımı çıktı()'yı gösteriyor
HİÇBİR zaman alıyor ama Devel::Profiler, zamanın yaklaşık %10'unun çıktı() içinde olduğunu gösteriyor.
Hangisine güveneceğimi bilmiyorum ama içimden bir ses bana bir sorun olduğunu söylüyor
Devel::DProf. HTML::Template::output(), çağrılması gereken büyük bir rutindir.
her test. Her iki durumda da, bir şeylerin düzeltilmesi gerekiyor.
YMMV.
Ayrıca "Devel::Profiler"ı "mod_perl"e bağlayan "Devel::Apache::Profiler" bölümüne bakın.
Geliştirici::SmallProf
"Devel::SmallProf" profil oluşturucu, Perl programınızın çalışma zamanını inceler ve bir
Her satırın kaç kez arandığını ve her satırın ne kadar süreyle arandığını gösteren satır satır listeleme
yürütmek için aldı. Çalışma zamanında Perl'e tanıdık "-d" bayrağı sağlanarak çağrılır.
$> perl -d:SmallProf kelime eşleme -f perl5db.pl
<...birden çok satır kesildi...>
perl5db.pl için kelime eşleme raporu:
dosyadaki satırlar: 9428
dosyadaki kelimeler: 50243
özel (kelime olmayan) karakterli kelimeler: 20480
sadece özel (kelime olmayan) karakterler içeren kelimeler: 7790
sadece ünsüzleri olan kelimeler: 4801
sadece büyük harfli kelimeler: 1316
sadece sesli harfli kelimeler: 1701
"Devel::SmallProf" çıktısını adlı bir dosyaya yazar. küçükprof.out, varsayılan olarak. bu
dosyanın formatı şöyle görünür:
:
Program sonlandırıldığında, çıktı herhangi bir standart kullanılarak incelenebilir ve sıralanabilir.
metin filtreleme araçları. Aşağıdaki gibi bir şey yeterli olabilir:
$> kedi küçükprof.out | grep \d*: | sıralama -k3 | tak | kafa -n20
251215 1.65674 7.68000 75: if ( $word =~ /($regex)/ ) {
251215 0.03264 4.40000 79: hata ayıklama("kelime: $i_wd ".($var? 'eşleşiyor'):
251215 0.02693 4.10000 81: dönüş $has;
260643 0.02841 4.07000 128: if ( $debug ) {
260643 0.02601 4.04000 126: $mesajım = shift;
251215 0.02641 3.91000 73: $'ım = 0;
251215 0.03311 3.71000 70: benim $i_wd = shift;
251215 0.02699 3.69000 72: normal ifadem = shift;
251215 0.02766 3.68000 71: benim $word = shift;
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: benim $i_cons = eşleşmelerim($i_word, $word,
50243 0.48837 0.88000 63: $count{$i_LINES}{büyük harf} =
50243 0.00516 0.88000 58: benim $i_caps = eşleşmelerim($i_word, $word, '^[(A-
50243 0.00631 0.81000 54: benim $i_spec = eşleşmelerim($i_word, $word, '[^a-
50243 0.00496 0.80000 57: benim $i_vows = eşleşmelerim($i_word, $word,
50243 0.00688 0.80000 53: $i_word++;
50243 0.48469 0.79000 62: $count{$i_LINES}{yalnızca} =
50243 0.48928 0.77000 60: $count{$i_LINES}{yeminler} =
50243 0.00683 0.75000 55: benim $i_only = eşleşmelerim($i_word, $word, '^[^a-
Alt rutin profil oluşturma modüllerine hemen biraz farklı bir odaklanma görebilirsiniz,
ve tam olarak hangi kod satırının en çok zaman aldığını görmeye başlıyoruz. Bu normal ifade satırı
örneğin biraz şüpheli görünüyor. Bu araçların olması gerektiğini unutmayın
birlikte kullanıldığında, kodunuzun profilini çıkarmanın tek bir en iyi yolu yoktur, en iyisini kullanmanız gerekir.
iş için araçlar.
"Devel::SmallProf"u "mod_perl"e bağlayan "Apache::SmallProf"a da bakın.
Devel::HızlıProf
"Devel::FastProf" başka bir Perl hat profili oluşturucusudur. Bu, elde etmek amacıyla yazılmıştır.
örneğin "Devel::SmallProf" ile mümkün olandan daha hızlı bir hat profili oluşturucu, çünkü bu
"C" ile yazılır. "Devel::FastProf" kullanmak için Perl'e "-d" argümanını sağlayın:
$> perl -d:FastProf kelime eşleme -f perl5db.pl
<...birden çok satır kesildi...>
perl5db.pl için kelime eşleme raporu:
dosyadaki satırlar: 9428
dosyadaki kelimeler: 50243
özel (kelime olmayan) karakterli kelimeler: 20480
sadece özel (kelime olmayan) karakterler içeren kelimeler: 7790
sadece ünsüzleri olan kelimeler: 4801
sadece büyük harfli kelimeler: 1316
sadece sesli harfli kelimeler: 1701
"Devel::FastProf" dosyaya istatistik yazar hızlıprof.out geçerli dizinde.
Belirtilebilen çıktı dosyası "fprofpp" kullanılarak yorumlanabilir.
komut satırı programı.
$> fprofpp | kafa -n20
# fprofpp çıktı formatı:
# dosya adı:satır süresi sayısı: kaynak
wordmatch:75 3.93338 251215: if ( $word =~ /($regex)/ ) {
wordmatch:79 1.77774 251215: debug("kelime: $i_wd ".($var? 'eşleşiyor': 'eşleşmiyor')." karakter: /$regex/");
kelime eşleme:81 1.47604 251215: dönüş $has;
wordmatch:126 1.43441 260643: $mesajım = shift;
wordmatch:128 1.42156 260643: if ( $debug ) {
wordmatch:70 1.36824 251215: benim $i_wd = shift;
wordmatch:71 1.36739 251215: benim $word = shift;
wordmatch:72 1.35939 251215: benim normal ifadem = shift;
Hemen her hattın çağrılma sayısının aynı olduğunu görebiliriz.
"Devel::SmallProf" çıktısı ve sıra, aşağıdakilere bağlı olarak yalnızca çok az farklıdır.
her satırın yürütülmesi için geçen sürenin sıralaması, "if ( $debug ) {" ve "my
$message = shift;", örneğin. Kaydedilen gerçek zamanlardaki farklılıklar,
dahili olarak kullanılan algoritma veya sistem kaynak sınırlamaları veya
çekişme.
"DBIx::*" altında çalışan veritabanı sorgularının profilini çıkaran DBIx::Profile'a da bakın.
ad.
Geliştirici::NYTProf
"Devel::NYTPrf" sonraki nesil Perl kod profil oluşturucunun birçok eksikliğini gidererek
diğer araçlar ve birçok harika özelliğin uygulanması. Her şeyden önce bir olarak kullanılabilir
hat profil oluşturucu, bir blok ya da altyordamı profilci, hepsi aynı anda. Ayrıca alt-
"clock_gettime()" sağlayan sistemlerde mikrosaniye (100ns) çözünürlük. Olabilir
profillendirilen program tarafından bile başlatıldı ve durduruldu. Profile tek satırlık bir giriş
"mod_perl" uygulamaları. "c" ile yazılmıştır ve muhtemelen en hızlı profil oluşturucudur
Perl'de kullanılabilir. Serinlik listesi sadece devam ediyor. Bu kadar yeter bakalım nasıl olacak
işe yarıyor - takmak ve kodu çalıştırmak için tanıdık "-d" anahtarını kullanın.
$> perl -d:NYTPrf kelime eşleme -f perl5db.pl
perl5db.pl için kelime eşleme raporu:
dosyadaki satırlar: 9427
dosyadaki kelimeler: 50243
özel (kelime olmayan) karakterli kelimeler: 20480
sadece özel (kelime olmayan) karakterler içeren kelimeler: 7790
sadece ünsüzleri olan kelimeler: 4801
sadece büyük harfli kelimeler: 1316
sadece sesli harfli kelimeler: 1701
"NYTPrf", dosyaya bir rapor veritabanı oluşturacaktır nytprof.out varsayılan olarak. İnsan
Sağlanan "nytprofhtml" (HTML) kullanılarak buradan okunabilir raporlar oluşturulabilir.
çıktı) ve "nytprofcsv" (CSV çıktısı) programları. Unix sistemini "html2text" kullandık
dönüştürmek için yardımcı program nytprof/index.html Burada kolaylık sağlamak için dosya.
$> html2text nytprof/index.html
Performans Profili İndeksi
kelime eşleşmesi için
26 Eylül Cuma 13:46:39 2008'de Koşun
26 Eyl 13:47:23 2008 tarihinde raporlandı
En İyi 15 Alt Program -- özel zamana göre sıralanır
|Çağrılar |P |F |Kapsayıcı|Özel|Alt rutin |
| | | |Zaman |Zaman | |
|251215|5 |1 |13.09263 |10.47692 |ana:: |eşleşmeler |
|260642|2 |1 |2.71199 |2.71199 |ana:: |hata ayıklama |
|1 |1 |1 |0.21404 |0.21404 |ana:: |rapor |
|2 |2 |2 |0.00511 |0.00511 |XSLLoader:: |yük (xsub) |
|14 |14|7 |0.00304 |0.00298 |İhracatçı:: |ithalat |
|3 |1 |1 |0.00265 |0.00254 |İhracatçı:: |as_ağır |
|10 |10|4 |0.00140 |0.00140 |vars:: |ithalat |
|13 |13|1 |0.00129 |0.00109 |sabit:: |içe aktar |
|1 |1 |1 |0.00360 |0.00096 |FileHandle:: |içe aktar |
|3 |3 |3 |0.00086 |0.00074 |uyarılar::kayıt::|içe aktar |
|9 |3 |1 |0.00036 |0.00036 |katı:: |bitler |
|13 |13|13|0.00032 |0.00029 |katı:: |ithalat |
|2 |2 |2 |0.00020 |0.00020 |uyarılar:: |içe aktar |
|2 |1 |1 |0.00020 |0.00020 |Getopt::Long:: |ParseOptionSpec|
|7 |7 |6 |0.00043 |0.00020 |katı:: |uniport |
Daha fazla bilgi için 189 alt programın tam listesine bakın.
Raporun ilk bölümü, hangisine ilişkin kritik bilgileri zaten gösteriyor?
altyordamlar en çok zamanı kullanır. Sonraki kaynak hakkında bazı istatistikler verir
dosyalar profilli.
Kaynak Kod Dosyaları -- özel zamana ve isme göre sıralanır
|Stmts |Özel|Ort. |Raporlar |Kaynak Dosya |
| |Zaman | | | |
|2699761|15.66654 |6e-06 |satır . engellemek . alt|kelime eşleme |
|35 |0.02187 |0.00062|satır . engellemek . alt|IO/Handle.pm |
|274 |0.01525 |0.00006|satır . engellemek . alt|Getopt/Long.pm |
|20 |0.00585 |0.00029|satır . engellemek . alt|Fcntl.pm |
|128 |0.00340 |0.00003|satır . engellemek . alt|İhracatçı/Ağır.pm |
|42 |0.00332 |0.00008|satır . engellemek . alt|IO/File.pm |
|261 |0.00308 |0.00001|satır . engellemek . alt|İhracatçı.pm |
|323 |0.00248 |8e-06 |satır . engellemek . alt|sabit.pm |
|12 |0.00246 |0.00021|satır . engellemek . alt|Dosya/Spec/Unix.pm |
|191 |0.00240 |0.00001|satır . engellemek . alt|vars.pm |
|77 |0.00201 |0.00003|satır . engellemek . alt|FileHandle.pm |
|12 |0.00198 |0.00016|satır . engellemek . alt|Sazan.pm |
|14 |0.00175 |0.00013|satır . engellemek . alt|Symbol.pm |
|15 |0.00130 |0.00009|satır . engellemek . alt|IO.pm |
|22 |0.00120 |0.00005|satır . engellemek . alt|IO/Seekable.pm |
|198 |0.00085 |4e-06 |satır . engellemek . alt|uyarılar/register.pm|
|114 |0.00080 |7e-06 |satır . engellemek . alt|katı.pm |
|47 |0.00068 |0.00001|satır . engellemek . alt|uyarılar.pm |
|27 |0.00054 |0.00002|satır . engellemek . alt|aşırı yük.pm |
|9 |0.00047 |0.00005|satır . engellemek . alt|SelectSaver.pm |
|13 |0.00045 |0.00003|satır . engellemek . alt|Dosya/Spec.pm |
|2701595|15.73869 | |Toplam |
|128647 |0.74946 | |Ortalama |
| |0.00201 |0.00003|Medyan |
| |0.00121 |0.00003|Sapma |
Tim Bunce tarafından geliştirilen NYTPrf 2.03 Perl profiler tarafından üretilen rapor ve
Adam Kaplan.
Bu noktada, kullanıyorsanız html rapor, çeşitli bağlantıları tıklayabilirsiniz
her alt programa ve her kod satırına girin. Çünkü metni kullanıyoruz
burada raporlama ve her kaynak dosya için oluşturulmuş raporlarla dolu bir dizin var,
ilgili olanın sadece bir kısmını göstereceğiz kelime eşleme-çizgisi.html dosya, yeterli
bu harika araçtan bekleyebileceğiniz çıktı türü hakkında bir fikir verin.
$> html2text nytprof/wordmatch-line.html
Performans Profili -- -blok görünümü-.-çizgi görünümü-.-alt görünüm-
kelime eşleşmesi için
26 Eylül Cuma 13:46:39 2008'de Koşun
26 Eyl 13:47:22 2008 tarihinde raporlandı
Dosya kelime eşleşmesi
Alt programlar -- özel zamana göre sıralanır
|Çağrılar |P|F|Kapsayıcı|Özel|Altyordam |
| | | |Zaman |Zaman | |
|251215|5|1|13.09263 |10.47692 |main::|matches|
|260642|2|1|2.71199 |2.71199 |ana::|hata ayıklama |
|1 |1|1|0.21404 |0.21404 |ana::|rapor |
|0 |0|0|0 |0 |ana::|BAŞLA |
|Line|Stmts.|Özel|Ort. |Kod |
| | |Zaman | | |
|1 | | | |#!/usr/bin/Perl |
|2 | | | | |
| | | | |katı kullanın; |
|3 |3 |0.00086 |0.00029|# katı 0.00003 arama yaparak 1 saniye harcadı:: |
| | | | |ithalat |
| | | | |uyarıları kullanın; |
|4 |3 |0.01563 |0.00521|# uyarılara 0.00012 çağrı yaparak 1s harcadı:: |
| | | | |ithalat |
|5 | | | | |
|6 | | | |=kafa1 ADI |
|7 | | | | |
|8 | | | |dosya sözcükleri - girdi dosyasının sözcük analizi |
<...kırp...>
|62 |1 |0.00445 |0.00445|raporu yazdır( %count ); |
| | | | |# ana::rapora 0.21404 arama yaparak 1 saniye harcadı|
|63 | | | | |
| | | | |# içinde 23.56955 (10.47692+2.61571) harcadı |
| | | | |main::251215 kez çağrılan eşleşmeler, |
| | | | |ortalama 0.00005s/arama: # 50243 kez |
| | | | |(2.12134+0.51939s) wordmatch'in 57. satırında, ort|
| | | | |0.00005s/çağrı # 50243 kez (2.17735+0.54550s) |
|64 | | | |kelime eşleşmesinin 56. satırında, ortalama 0.00005s/çağrı # |
| | | | 50243. satırda |2.10992 kez (0.51797+58s) |
| | | | |kelime eşleme, ortalama 0.00005s/çağrı # 50243 kez |
| | | | |(2.12696+0.51598s) wordmatch'in 55. satırında, ort|
| | | | |0.00005s/çağrı # 50243 kez (1.94134+0.51687s) |
| | | | |kelime eşleşmesinin 54. satırında, ortalama 0.00005s/çağrı |
| | | | |alt eşleşmeler { |
<...kırp...>
|102 | | | | |
| | | | |# main::debug içinde 2.71199 saniye harcadı ve bu |
| | | | |260642 kez arandı, ortalama 0.00001s/çağrı: # |
| | | | |251215 kez (2.61571+0s) ana tarafından::eşleşir |
|103 | | | |kelime eşleşmesinin 74. satırı, ortalama 0.00001s/çağrı # 9427 |
| | | | |kez (0.09628+0s) kelime eşleşmesinin 50. satırında, ortalama|
| | | | |0.00001s/çağrı |
| | | | |alt hata ayıklama { |
|104 |260642|0.58496 |2e-06 |$mesajım = shift; |
|105 | | | | |
|106 |260642|1.09917 |4e-06 |eğer ( $hata ayıklama ) { |
|107 | | | |baskı STDERR "DBG: $mesaj\n"; |
|108 | | | |} |
|109 | | | |} |
|110 | | | | |
|111 |1 |0.01501 |0.01501|çıkış 0; |
|112 | | | | |
Orada çok faydalı bilgiler var - bu, ileriye giden yol gibi görünüyor.
Ayrıca bkz. "Devel::NYTPrf"i "mod_perl"e bağlayan "Devel::NYTPrf::Apache".
SIRALAMA
Perl modülleri, bir performans analistinin emrinde olan tek araç değildir.
Bir sonraki örneğin gösterdiği gibi, "zaman" gibi araçlar gözden kaçırılmamalıdır.
sıralamaya hızlı bir bakış. Verimlilik konusunda birçok kitap, tez ve makale yazılmıştır.
sıralama algoritmaları ve bu tür işleri tekrarlamanın yeri burası değil, birkaç iyi şey var
ayrıca bir göz atmayı hak eden modülleri sıralama: "Sort::Maker", "Sort::Key" bahar
akıl. Bununla birlikte, belirli Perl'e özgü bazı gözlemler yapmak hala mümkündür.
veri kümelerinin sıralanması ile ilgili konularda yorumlar ve bir veya iki örnek veriniz.
büyük veri hacimlerini sıralamanın performansı nasıl etkileyebileceği ile ilgili. Öncelikle sık sık
büyük miktarda veri sıralanırken gözden kaçan nokta, veriyi azaltmaya çalışabilir
ele alınacak şekilde ayarlanmış ve çoğu durumda "grep()" basit bir filtre olarak oldukça faydalı olabilir:
@data = grep sıralama { /$filter/ } @gelen
Bunun gibi bir komut, gerçekten sıralamak için malzeme hacmini büyük ölçüde azaltabilir.
her şeyden önce ve tamamen kendi temeline dayalı olarak çok hafife alınmamalıdır.
basitlik. "KISS" ilkesi çok sık gözden kaçırılır - bir sonraki örnek,
göstermek için basit sistem "zaman" yardımcı programı. Gerçek bir örneğe bakalım
büyük bir dosyanın içeriğini sıralamak, bir apache günlük dosyası yapardı. Bu, bir
çeyrek milyon satır, 50M boyutunda ve bir parçası şuna benziyor:
# log dosyası
188.209-65-87.adsl-dyn.isp.belgacom.be - - [08/Feb/2007:12:57:16 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/ 4.0 (uyumlu; MSIE 6.0; Windows NT 5.1; SV1)"
188.209-65-87.adsl-dyn.isp.belgacom.be - - [08/Feb/2007:12:57:16 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/ 4.0 (uyumlu; MSIE 6.0; Windows NT 5.1; SV1)"
151.56.71.198 - - [08/Şubat/2007:12:57:41 +0000] "GET /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] "GET /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] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; tr- ABD; 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 (uyumlu; MSIE 6.0; Windows NT 5.1; SV1)"
217.113.68.60 - - [08/Feb/2007:13:02:16 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net/" "Mozilla/4.0 (uyumlu; MSIE 6.0; Windows NT 5.1; SV1)"
debora.to.isac.cnr.it - - [08/Feb/2007:13:03:58 +0000] "GET /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/5.0 (uyumlu; Konqueror/3.4; Linux) KHTML/3.4.0 (Gecko gibi)"
debora.to.isac.cnr.it - - [08/Feb/2007:13:03:58 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/5.0 (uyumlu; Konqueror/3.4; Linux) KHTML/3.4.0 (Gecko gibi)"
debora.to.isac.cnr.it - - [08/Feb/2007:13:03:58 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (uyumlu; Konqueror/ 3.4; Linux) KHTML/3.4.0 (Gecko gibi)"
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] "GET /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] "GET /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] "GET /robots.txt HTTP/1.0" 200 179 "-" "voyager/1.0"
crawl1.cosmixcorp.com - - [08/Feb/2007:13:28:25 +0000] "GET /links.html HTTP/1.0" 200 3413 "-" "voyager/1.0"
fhm226.internetdsl.tpnet.pl - - [08/Feb/2007:13:37:32 +0000] "GET /suse-on-vaio.html HTTP/1.1" 200 2858 "http://www.linux-on-laptops.com/sony.html" "Mozilla/4.0 (uyumlu; MSIE 6.0; Windows NT 5.1; SV1)"
fhm226.internetdsl.tpnet.pl - - [08/Feb/2007:13:37:34 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net/suse-on-vaio.html" "Mozilla/4.0 (uyumlu; 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 (uyumlu; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) .XNUMX)"
80.247.140.134 - - [08/Feb/2007:13:57:37 +0000] "GET /data/css HTTP/1.1" 404 206 "http://www.rfi.net" "Mozilla/4.0 (uyumlu; 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] "GET /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] "GET /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 .ağ"
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 Profil/MIDP -2.0 Yapılandırma/CLDC-1.1"
Buradaki özel görev, bu dosyanın 286,525 satırını Yanıt Kodu, Sorgu,
Tarayıcı, Yönlendiren URL ve son olarak Tarih. Bir çözüm aşağıdaki kodu kullanmak olabilir,
komut satırında verilen dosyalar üzerinde yinelenir.
# sort-apache-günlüğü
#!/usr/bin/Perl -n
sıkı kullanın;
uyarıları kullan;
benim verim;
HAT:
süre ( <> ) {
benim $satırım = $_;
(Eğer
$satır =~ m/^(
([\w\.\-]+) # istemci
\s*-\s*-\s*\[
([^]]+) # tarih
\]\s*"\w+\s*
(\S+) # sorgu
[^"]+"\s*
(\d+) # durum
\s+\S+\s+"[^"]*"\s+"
([^"]*) # tarayıcı
"
.*
)$/x
) {
@yığınlarım = split(/ +/, $satır);
benim $ip = $1;
benim $tarihim = $2;
benim $sorgum = $3;
benim $durumum = $4;
benim $tarayıcım = $5;
push(@veri, [$ip, $tarih, $sorgu, $durum, $tarayıcı, $satır]);
}
}
benim @sortedim = sıralama {
$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]
} @veri;
foreach benim $data ( @sorted ) {
$data->[5] yazdır;
}
çıkış 0;
Bu programı çalıştırırken, çıktıyı kontrol etmek için "STDOUT"u yeniden yönlendirin.
aşağıdaki test çalıştırmalarından düzeltin ve genel durumu kontrol etmek için sistem "zaman" yardımcı programını kullanın
Çalışma süresi.
$> time ./sort-apache-log günlük dosyası > sıralama dışı
gerçek 0m17.371s
kullanıcı 0m15.757s
sistem 0m0.592s
Programın çalışması 17 wallclock saniyeden biraz fazla sürdü. Farklı "zaman" değerlerine dikkat edin
çıktılar, her zaman aynı olanı kullanmak ve her birinin ne olduğunu karıştırmamak önemlidir.
anlamına gelir.
Geçen Gerçek Zaman
Genel veya duvar saati, "zaman"ın çağrıldığı ve çağrıldığı zaman arasındaki süre
sona erer. Geçen süre, hem kullanıcı hem de sistem sürelerini ve harcanan süreyi içerir.
sistemdeki diğer kullanıcıları ve süreçleri beklemek. Kaçınılmaz olarak, bu en
verilen ölçümlerin yaklaşık değeri.
Kullanıcı CPU Zamanı
Kullanıcı zamanı, tüm sürecin kullanıcı adına harcanan süredir.
bu sistem bu programı çalıştırıyor.
Sistem CPU Süresi
Sistem zamanı, çekirdeğin rutinleri yürütmek için harcadığı süredir veya
sistem çağrıları, bu süreç kullanıcı adına.
Aynı işlemi bir "Schwarzian Dönüşümü" olarak çalıştırarak,
tüm verileri depolamak için giriş ve çıkış dizileri ve giriş üzerinde olduğu gibi doğrudan çalışır
da gelir. Aksi takdirde, kod oldukça benzer görünüyor:
# sort-apache-log-schwarzian
#!/usr/bin/Perl -n
sıkı kullanın;
uyarıları kullan;
baskı
harita $_->[0] =>
düzenlemek {
$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]
}
harita [ $_, m/^(
([\w\.\-]+) # istemci
\s*-\s*-\s*\[
([^]]+) # tarih
\]\s*"\w+\s*
(\S+) # sorgu
[^"]+"\s*
(\d+) # durum
\s+\S+\s+"[^"]*"\s+"
([^"]*) # tarayıcı
"
.*
)$/xy ]
=> <>;
çıkış 0;
Yeni saati kontrol etmek için yeni kodu yukarıdaki gibi aynı günlük dosyasına karşı çalıştırın.
$> time ./sort-apache-log-schwarzian günlük dosyası > out-schwarz
gerçek 0m9.664s
kullanıcı 0m8.873s
sistem 0m0.704s
Zaman yarıya indirildi, bu da herhangi bir standarda göre kayda değer bir hız artışı.
Doğal olarak, çıktının ilk program çalıştırmasıyla tutarlı olup olmadığını kontrol etmek önemlidir.
Unix sistemi "cksum" yardımcı programının devreye girdiği yer burasıdır.
$> cksum out-sort out-schwarz
3044173777 52029194 sıra dışı
3044173777 52029194 dış
BTW. Bir programı %50 oranında hızlandırdığınızı gören yöneticilerin baskısından da sakının.
çalışma zamanı bir kez, yalnızca bir ay sonra aynı şeyi tekrar yapmak için bir istek almak için (gerçek hikaye) -
bir Perl programcısı olsanız bile, yalnızca insan olduğunuzu belirtmeniz gerekecek ve
neler yapabileceğini göreceksin...
KERESTECİLİK
Herhangi bir iyi geliştirme sürecinin önemli bir parçası, uygun hata işlemedir.
uygun şekilde bilgilendirici mesajlar, ancak bir düşünce okulu var
günlük dosyalarının olması gerektiğini önerir konuşkan, sanki kesintisiz çıktı zinciri bir şekilde
programın devamlılığını sağlar. Hız herhangi bir şekilde bir sorunsa, bu yaklaşım
yanlış.
Yaygın bir görüş, şuna benzer bir koddur:
logger->debug( "İşlem kimliği aracılığıyla bir günlük mesajı: $$ INC: " . Dumper(\%INC) )
Sorun şu ki, hata ayıklandığında bile bu kod her zaman ayrıştırılacak ve yürütülecektir.
günlük yapılandırma dosyasında ayarlanan düzey sıfırdır. Bir kere hata ayıklama() alt program
girildi ve dahili $debug değişkeninin sıfır olduğu onaylandı, örneğin mesaj
gönderilenler atılacak ve program devam edecektir. örnekte
verilmiş olsa da, "\%INC" karma değeri zaten atılmış olacak ve ileti dizesi
oluşturulmuş, bunların tümü ifadede bir hata ayıklama değişkeni tarafından atlanabilir
seviye, bunun gibi:
logger->debug( "İşlem kimliği aracılığıyla bir günlük mesajı: $$ INC: " . Dumper(\%INC) ) if $DEBUG;
Bu etki, her iki formda da bir test komut dosyası oluşturularak gösterilebilir.
Tipik "logger()" işlevselliğini taklit etmek için "debug()" alt yordamı.
#ifdebug
#!/usr/bin/Perl
sıkı kullanın;
uyarıları kullan;
Benchmark'ı kullanın;
Data::Dumper'ı kullanın;
benim $DEBUG = 0;
alt hata ayıklama {
benim $msg = shift;
eğer ($DEBUG) {
"DEBUG: $msg\n" yazdır;
}
};
zamanbunlar(100000, {
'hata ayıklama' => alt {
debug("İşlem kimliği aracılığıyla bir $0 günlük mesajı: $$" . Dumper(\%INC) )
},
'ifdebug' => alt {
debug("İşlem kimliği aracılığıyla bir $0 günlük mesajı: $$" . Dumper(\%INC) ) eğer $DEBUG
},
});
Bakalım "Benchmark" bundan ne çıkarmış:
$> perl ifdebug
Benchmark: 100000 yineleme sabit, alt zamanlama...
ifdebug: 0 duvar saati saniye ( 0.01 usr + 0.00 sys = 0.01 CPU) @ 10000000.00/s (n=100000)
(uyarı: güvenilir bir sayım için çok az yineleme)
hata ayıklama: 14 duvar saati saniye (13.18 usr + 0.04 sys = 13.22 CPU) @ 7564.30/s (n=100000)
Bir durumda, herhangi bir çıktı vermekle tamamen aynı şeyi yapan kod
hata ayıklama bilgisi söz konusudur, başka bir deyişle hiçbir şey, 14 saniye sürer ve
diğer durumda kod saniyenin yüzde birini alır. Oldukça kesin görünüyor. Kullanın
$DEBUG değişkeni, smart'a güvenmek yerine alt yordamı çağırmadan ÖNCE
içindeki işlevsellik.
Günlüğü if DEBUG (sabit)
Bir derleme zamanı "DEBUG" kullanarak önceki fikri biraz daha ileri götürmek mümkündür.
sabiti.
# ifdebug-sabit
#!/usr/bin/Perl
sıkı kullanın;
uyarıları kullan;
Benchmark'ı kullanın;
Data::Dumper'ı kullanın;
sabit kullan
HATA AYIKLAMA => 0
;
alt hata ayıklama {
if ( HATA AYIKLAMA ) {
benim $msg = shift;
"DEBUG: $msg\n" yazdır;
}
};
zamanbunlar(100000, {
'hata ayıklama' => alt {
debug("İşlem kimliği aracılığıyla bir $0 günlük mesajı: $$" . Dumper(\%INC) )
},
'sabit' => alt {
hata ayıklama("İşlem kimliği aracılığıyla bir $0 günlük mesajı: $$" . Dumper(\%INC) ) eğer DEBUG
},
});
Bu programı çalıştırmak aşağıdaki çıktıyı üretir:
$> perl ifdebug-sabit
Benchmark: 100000 yineleme sabit, alt zamanlama...
sabit: 0 duvar saati saniyesi (-0.00 usr + 0.00 sys = -0.00 CPU) @ -7205759403792793600000.00/sn (n=100000)
(uyarı: güvenilir bir sayım için çok az yineleme)
alt: 14 duvar saati saniye (13.09 usr + 0.00 sys = 13.09 CPU) @ 7639.42/s (n=100000)
"DEBUG" sabiti, zemini $debug değişkeniyle bile siler, eksi saatte devreye girer
sıfır saniye ve bir "uyarı: güvenilir bir sayım için çok az yineleme" mesajı oluşturur
pazarlık içine. Gerçekten neler olup bittiğini ve neden çok az yineleme yaptığımızı görmek için
100000 istediğimizi düşündük, yenisini incelemek için çok kullanışlı "B::Deparse" kullanabiliriz
Kod:
$> Perl -MO=ifdebug-constant'ı ayrıştır
Benchmark'ı kullanın;
Data::Dumper'ı kullanın;
sabit kullan ('DEBUG', 0);
alt hata ayıklama {
uyarıları kullan;
katı 'başvurular' kullanın;
0;
}
uyarıları kullan;
katı 'başvurular' kullanın;
timethese(100000, {'sub', sub {
"İşlem kimliği aracılığıyla bir $0 günlük iletisi: $$" hatalarını ayıklayın. Damper(\%INC);
}
, 'sabit', alt {
0;
}
});
ifdebug-sabit sözdizimi tamam
Çıktı şunları gösterir: devamlı() test ettiğimiz alt yordam değeri ile değiştiriliyor
"DEBUG" sabiti: sıfır. Test edilecek hat tamamen optimize edildi ve
bundan daha verimli olamazsın.
PostScript
Bu belge, sıcak noktaları belirleme ve kontrol etme konusunda birkaç yol sağlamıştır.
herhangi bir değişikliğin kodun çalışma zamanını iyileştirip iyileştirmediği.
Son bir düşünce olarak, (yazma sırasında) bir fikir üretmenin mümkün olmadığını unutmayın.
sıfır veya negatif zamanda çalışacak faydalı bir program ve bu temel ilke,
şu şekilde yazılmıştır: işe yarar programlar vardır yavaş onların tanımı gereği. tabii ki mümkün
neredeyse anlık bir program yazmak için, ama çok fazla bir şey yapmayacak, işte çok
verimli:
$> perl -e 0
Daha fazlasının optimize edilmesi "p5p" için bir iştir.
onworks.net hizmetlerini kullanarak perlperf'i çevrimiçi kullanın