انگلیسیفرانسویاسپانیایی

فاویکون OnWorks

perlperf - آنلاین در ابر

اجرای perlperf در ارائه دهنده هاست رایگان OnWorks از طریق Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS

این دستور perlperf است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


perlperf - تکنیک های عملکرد و بهینه سازی Perl

شرح


این مقدمه ای برای استفاده از تکنیک های عملکرد و بهینه سازی است که می تواند باشد
با اشاره خاص به برنامه های پرل استفاده می شود. در حالی که بسیاری از توسعه دهندگان پرل آمده اند
از زبان های دیگر، و می توانند از دانش قبلی خود در صورت لزوم استفاده کنند، بسیاری از آنها وجود دارد
افراد دیگری که ممکن است از چند اشاره گر خاص پرل بهره مند شوند. اگر می خواهید
نسخه فشرده، شاید بهترین توصیه از سامورایی مشهور ژاپنی باشد،
میاموتو موساشی، که گفت:

"درگیر فعالیت های بی فایده نباشید"

در 1645.

بررسی اجمالی


شاید رایج ترین اشتباهی که برنامه نویسان مرتکب می شوند تلاش برای بهینه سازی کدشان باشد
قبل از اینکه یک برنامه واقعاً کار مفیدی انجام دهد - این ایده بدی است. فایده ای نداره
داشتن یک برنامه بسیار سریع که کار نمی کند. اولین کار این است که یک برنامه را دریافت کنید
به درستی کاری بکنید مفید، (غیر از اطمینان از کامل بودن مجموعه آزمایشی
کاربردی)، و تنها پس از آن به بهینه سازی آن فکر کنید. تصمیم به بهینه سازی موجود
کد کار، چندین مرحله ساده اما ضروری برای در نظر گرفتن وجود دارد که ذاتی هستند
به هر فرآیند بهینه سازی

ONE STEP جانبی
در ابتدا، شما باید یک زمان پایه برای کد موجود تعیین کنید، که زمان بندی به آن نیاز دارد
قابل اعتماد و قابل تکرار باشد. احتمالاً می خواهید از "Benchmark" یا استفاده کنید
ماژول های "Devel::NYTProf" یا چیزی مشابه برای این مرحله یا شاید سیستم یونیکس
ابزار "زمان"، هر کدام که مناسب باشد. برای فهرست طولانی‌تر به پایه این سند مراجعه کنید
ماژول های معیار و پروفایل، و خواندن بیشتر توصیه می شود.

ONE STEP رو به جلو
بعد، با بررسی برنامه برای داغ نقاط، (مکان هایی که به نظر می رسد کد اجرا می شود
به آرامی)، کد را تغییر دهید تا سریعتر اجرا شود. با استفاده از نسخه
نرم افزار کنترل، مانند "براندازی"، اطمینان حاصل می کند که هیچ تغییری برگشت ناپذیر نیست. همینطور است
کمانچه زدن در اینجا و کمانچه در آنجا آسان است - در هر زمان و یا ممکن است زیاد تغییر نکنید
کدام قطعه کد را کشف نکنید واقعا بیت کند بود

یکی دیگر از STEP جانبی
این کافی نیست که بگوییم: "این باعث می شود سریعتر اجرا شود"، باید آن را بررسی کنید. را دوباره اجرا کنید
کد تحت کنترل ماژول های معیار یا پروفایل، از مرحله اول بالا،
و بررسی کنید که کد جدید اجرا شده باشد همان کار in کمتر زمان. کار خود را ذخیره کنید و
تکرار...

عمومی GUIDELINES


نکته مهم هنگام در نظر گرفتن عملکرد این است که به یاد داشته باشید چیزی به نام الف وجود ندارد
"گلوله طلایی"، به همین دلیل است که هیچ قانون وجود ندارد، فقط دستورالعمل وجود دارد.

واضح است که کد درون خطی سریعتر از فراخوانی های زیر روال یا متد خواهد بود.
زیرا سربار کمتری وجود دارد، اما این رویکرد ضرر کمتری دارد
قابل نگهداری است و به قیمت استفاده بیشتر از حافظه است - چیزی به نام وجود ندارد
ناهار رایگان اگر به دنبال عنصری در لیست هستید، می‌تواند کارآمدتر باشد
داده ها را در یک ساختار هش ذخیره کنید، و سپس به سادگی نگاه کنید که آیا کلید موجود است یا خیر
تعریف شده، به جای حلقه زدن در کل آرایه با استفاده از grep() برای مثال. substr()
ممکن است (بسیار) سریعتر از grep() اما نه به اندازه انعطاف پذیری، بنابراین شما باید معامله دیگری را انجام دهید
دسترسی داشته باشید. کد شما ممکن است حاوی خطی باشد که اجرای آن 0.01 ثانیه طول می کشد که اگر شما آن را اجرا کنید
آن را 1,000 بار فراخوانی کنید، به احتمال زیاد در برنامه ای که حتی فایل های با اندازه متوسط ​​را تجزیه می کند
به عنوان مثال، شما در حال حاضر 10 ثانیه تاخیر دارید، فقط در یک مکان کد واحد، و اگر شما
100,000 بار با آن خط تماس بگیرید، کل برنامه شما به یک خزیدن غیرقابل تحمل کاهش می یابد.

استفاده از یک زیربرنامه به عنوان بخشی از نوع خود، یک راه قدرتمند برای رسیدن به آنچه می خواهید است،
اما معمولا کندتر از داخلی خواهد بود الفبایی "cmp" و عددی مرتب سازی "<=>".
اپراتورها این امکان وجود دارد که چندین بار از داده های خود عبور کنید و شاخص هایی را ایجاد کنید
مرتب سازی آینده را کارآمدتر کنید و از چیزی که به عنوان "OM" شناخته می شود استفاده کنید (Orcish
مانور) برای ذخیره کردن کلیدهای مرتب سازی از قبل. جستجوی حافظه پنهان، اگرچه ایده خوبی است، می تواند
خود منبع کاهش سرعت با اجرای یک پاس دوگانه بر روی داده ها - یک بار برای راه اندازی است
کش، و یک بار برای مرتب کردن داده ها. استفاده از "pack()" برای استخراج کلید مرتب سازی مورد نیاز
در یک رشته ثابت می تواند راهی کارآمد برای ساخت یک رشته واحد برای مقایسه باشد،
به جای استفاده از کلیدهای مرتب سازی متعدد، که امکان استفاده از استاندارد، نوشته شده را فراهم می کند
در "c" و fast، عملکرد "sort()" perl در خروجی، و اساس "GRT" است.
(تبدیل گاتمن راسلر). برخی از ترکیب‌های رشته‌ای می‌توانند «GRT» را فقط با سرعت کاهش دهند
پیچیده بودن خیلی ساده به نفع خودش

برای برنامه‌هایی که از پس‌زمینه‌های پایگاه داده استفاده می‌کنند، فضای نام استاندارد «DBIx» سعی دارد کمک کند
با سرحال نگه داشتن چیزها، نه تنها به این دلیل که تلاش می کند نه پرس و جو از پایگاه داده تا زمانی که
آخرین لحظه ممکن، اما همیشه اسنادی را که با کتابخانه های انتخابی شما ارائه می شود، بخوانید.
از جمله بسیاری از مسائلی که توسعه دهندگان در برخورد با پایگاه های داده باید از آن آگاه باشند، این است
همیشه از متغیرهای "SQL" استفاده کنید و در صورت امکان مجموعه داده های پیش از واکشی را در نظر بگیرید
اثبات سودمندی تقسیم یک فایل بزرگ با اختصاص چندین فرآیند به تجزیه
یک فایل واحد، استفاده از عبارت "POE"، "threads" یا "fork" نیز می تواند یک راه مفید برای بهینه سازی باشد.
استفاده شما از منابع موجود "CPU"، اگرچه این تکنیک مملو از آن است
مسائل همزمانی و توجه زیاد به جزئیات را می طلبد.

هر موردی کاربرد خاصی دارد و یک یا چند استثنا دارد و وجود ندارد
جایگزینی برای اجرای چند آزمایش و یافتن این که کدام روش برای شما بهتر کار می کند
محیط خاص، به همین دلیل است که نوشتن کد بهینه علم دقیقی نیست و چرا
ما استفاده از پرل را بسیار دوست داریم - TMTOWTDI.

معیار


در اینجا چند مثال برای نشان دادن استفاده از ابزارهای بنچمارک پرل آورده شده است.

اختصاص دادن و عدم ارجاع متغیرها
من مطمئن هستم که اکثر ما کدی را دیده‌ایم که شبیه این (یا بدتر از آن) است:

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

این نوع کدها می توانند برای خواندن یک چشم درد واقعی باشند و همچنین به اشتباهات تایپی بسیار حساس هستند.
و خیلی واضح تر است که به طور صریح به متغیر ارجاع داده شود. ما در حال کنار زدن هستیم
موضوع کار با تکنیک های برنامه نویسی شی گرا برای کپسوله کردن متغیر
دسترسی از طریق متدها، فقط از طریق یک شی قابل دسترسی است. در اینجا ما فقط بحث می کنیم
اجرای فنی انتخابی، و اینکه آیا این تأثیری بر عملکرد دارد یا خیر. ما میتوانیم
با قرار دادن کد مقایسه ای، ببینید که آیا این عملیات عدم ارجاع سربار دارد یا خیر
یک فایل و اجرای تست "Benchmark".

# عدم ارجاع

#!/usr/bin/perl

سخت استفاده کنید
استفاده از هشدارها؛

استفاده از معیار؛

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

timethese(1000000, {
'مستقیم' => زیر {
my $x = $ref->{ref}->{_myscore}. $ref->{ref}->{_yourscore} ;
},
'مرجع کردن' => زیر {
my $ref = $ref->{ref};
my $myscore = $ref->{_myscore};
my $yourscore = $ref->{_yourscore};
من $x = $myscore . $yourscore;
},
})؛

اجرای هر اندازه گیری زمان بندی به تعداد کافی برای اعداد ضروری است
بر روی یک میانگین عددی تنظیم شود، در غیر این صورت هر اجرا به طور طبیعی به دلیل نوسان خواهد بود
تغییرات در محیط، برای کاهش اثر مشاجره برای منابع "CPU" و
به عنوان مثال پهنای باند شبکه با اجرای کد بالا برای یک میلیون تکرار، می توانیم
نگاهی به خروجی گزارش توسط ماژول "Benchmark" بیندازید تا ببینید کدام رویکرد است
موثرترین.

$> perl reference

معیار: زمان بندی 1000000 تکرار عدم ارجاع، مستقیم...
reference: 2 ثانیه ساعت دیواری (1.59 usr + 0.00 sys = 1.59 CPU) @ 628930.82/s (n=1000000)
مستقیم: 1 ثانیه ساعت دیواری (1.20 usr + 0.00 سیستم = 1.20 CPU) @ 833333.33/s (n=1000000)

تفاوت واضح است و رویکرد عدم ارجاع کندتر است. در حالی که موفق شد
برای اجرای میانگین 628,930 بار در ثانیه در طول آزمایش ما، رویکرد مستقیم
متأسفانه توانست 204,403 بار دیگر را اجرا کند. متاسفانه، به دلیل وجود دارد
نمونه های زیادی از کد نوشته شده با استفاده از دسترسی متغیر مستقیم چند لایه، و
معمولا وحشتناک است با این حال، بسیار سریعتر است. این سوال باقی می ماند که آیا
یک دقیقه افزایش در واقع ارزش خستگی چشم یا از دست دادن قابلیت نگهداری را دارد.

جستجو و جایگزین کردن or tr
اگر رشته ای داشته باشیم که باید اصلاح شود، در حالی که یک regex تقریبا همیشه زیاد خواهد بود
انعطاف پذیرتر، "tr"، ابزاری که اغلب کم استفاده می شود، هنوز هم می تواند مفید باشد. یک سناریو ممکن است باشد
همه حروف صدادار را با یک کاراکتر دیگر جایگزین کنید. راه حل regex ممکن است به شکل زیر باشد:

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

جایگزین "tr" ممکن است به شکل زیر باشد:

$str =~ tr/aeiou//

ما می‌توانیم آن را در یک فایل آزمایشی قرار دهیم که می‌توانیم آن را اجرا کنیم تا بررسی کنیم کدام روش سریع‌ترین است.
با استفاده از یک متغیر جهانی $STR برای تخصیص به متغیر my $str تا از پرل جلوگیری شود
تلاش برای بهینه سازی هر یک از کارها با توجه به اینکه فقط یک بار اختصاص داده شده است.

# regex-transliterate

#!/usr/bin/perl

سخت استفاده کنید
استفاده از هشدارها؛

استفاده از معیار؛

my $STR = "$$-این و آن";

timethese(1000000, {
'sr' => sub { my $str = $STR; $str =~ s/[aeiou]/x/g; بازگشت $str; }،
'tr' => sub { my $str = $STR; $str =~ tr/aeiou//; بازگشت $str; }،
})؛

اجرای کد نتایج ما را به ما می دهد:

$> perl regex-transliterate

معیار: زمان بندی 1000000 تکرار sr، tr...
sr: 2 ثانیه ساعت دیواری (1.19 usr + 0.00 sys = 1.19 CPU) @ 840336.13/s (n=1000000)
tr: 0 ساعت دیواری ثانیه (0.49 usr + 0.00 sys = 0.49 CPU) @ 2040816.33/s (n=1000000)

نسخه "tr" یک برنده آشکار است. یک راه حل انعطاف پذیر است، دیگری سریع است - و
این انتخاب برنامه نویس است که از کدام مورد استفاده کند.

برای تکنیک های مفید بیشتر، اسناد "Benchmark" را بررسی کنید.

نمایه سازی ابزارها


یک قطعه کد کمی بزرگتر چیزی را ارائه می دهد که یک پروفایلر می تواند روی آن تولید کند
آمار گزارش گیری گسترده تر این مثال از برنامه ساده "wordmatch" استفاده می کند
که یک فایل ورودی داده شده را تجزیه می کند و یک گزارش کوتاه از محتویات منتشر می کند.

# تطبیق کلمه

#!/usr/bin/perl

سخت استفاده کنید
استفاده از هشدارها؛

=head1 NAME

filewords - تجزیه و تحلیل کلمه فایل ورودی

=head1 خلاصه

filewords -f inputfilename [-d]

=head1 توضیحات

این برنامه نام فایل داده شده را که با C<-f> مشخص شده است تجزیه می کند و a را نمایش می دهد
تحلیل ساده کلمات موجود در آن برای فعال کردن از کلید C<-d> استفاده کنید
اشکال زدایی پیام ها

= برش

از FileHandle استفاده کنید.
استفاده از Getopt::Long;

my $debug = 0;
my $file = '';

من $نتیجه = GetOptions (
'debug' => \$debug,
'file=s' => \$file,
);
die("args نامعتبر") مگر اینکه $result;

مگر اینکه ( -f $file ) {
die("استفاده: $0 -f نام فایل [-d]");
}
my $FH = FileHandle->new("< $file") or die("unable to open file($file): $!");

$i_LINES من = 0;
$i_WORDS من = 0;
%count من = ();

خطوط @ من = <$FH>;
پیش از خط $ من ( @lines ) {
$i_LINES++;
$line =~ s/\n//;
my @words = split(/ +/, $line);
my $i_words = scalar(@words);
$i_WORDS = $i_WORDS + $i_words;
debug("خط: $i_LINES که کلمات $i_words را تامین می کند: @words");
$i_word من = 0;
foreach my $word ( @words ) {
$i_word++;
$count{$i_LINES}{spec} += matches($i_word, $word, '[^a-zA-Z0-9]');
$count{$i_LINES}{فقط} += مطابقت ($i_word، $word، '^[^a-zA-Z0-9]+$');
$count{$i_LINES}{cons} += مطابقت ($i_word، $word، '^[(?i:bcdfghjklmnpqrstvwxyz)]+$');
$count{$i_LINES}{vows} += مطابقت ($i_word، $word، '^[(?i:aeiou)]+$');
$count{$i_LINES}{caps} += مطابقت ($i_word, $word, '^[(AZ)]+$');
}
}

چاپ گزارش ( %count );

موارد فرعی {
$i_wd = shift;
من $word = shift;
من $regex = shift;
من $ has = 0;

اگر ($word =~ /($regex)/ ) {
$has++ اگر $1;
}

debug("word: $i_wd ".($has ? 'match' : 'نطابق ندارد')." chars: /$regex/");

بازگشت $has;
}

گزارش فرعی {
% گزارش من = @_;
من %rep

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

گزارش من = qq|
گزارش $0 برای $file:
خطوط در فایل: $i_LINES
کلمات موجود در فایل: $i_WORDS
کلمات با کاراکترهای خاص (غیر کلمه): $i_spec
کلمات فقط با کاراکترهای خاص (غیر کلمه): $i_only
کلمات فقط با حروف صامت: $i_cons
کلمات فقط با حروف بزرگ: $i_caps
کلمات فقط با حروف صدادار: $i_vows
|;

بازگشت $گزارش;
}

اشکال زدایی فرعی {
my $message = shift;

if ($debug ) {
چاپ STDERR "DBG: $message\n";
}
}

خروجی 0;

توسعه::DProf
این ماژول ارجمند بیش از بیش از گذشته استاندارد واقعی برای پروفایل کد Perl بوده است
یک دهه است، اما با تعدادی ماژول دیگر جایگزین شده است که ما را به آن بازگردانده است
قرن بیست و یکم اگرچه به شما توصیه می شود که ابزار خود را از چندین مورد ارزیابی کنید
ذکر شده در اینجا و از لیست CPAN در پایه این سند، (و در حال حاضر
توسعه:: به نظر می رسد NYTProf سلاح منتخب باشد - به زیر مراجعه کنید)، ما نگاهی سریع به
ابتدا خروجی Devel::DProf، برای تعیین یک خط پایه برای ابزارهای پروفایل پرل. اجرا کنید
برنامه فوق تحت کنترل "Devel::DProf" با استفاده از سوئیچ "-d" روی دستور-
خط.

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

<...چند خط قطع شد...>

گزارش wordmatch برای perl5db.pl:
خطوط در پرونده: 9428
کلمات در فایل: 50243
کلمات با کاراکترهای خاص (غیر کلمه): 20480
کلمات فقط با کاراکترهای خاص (غیر کلمه): 7790
کلمات فقط با حروف صامت: 4801
کلمات فقط با حروف بزرگ: 1316
کلمات فقط با حروف صدادار: 1701

"Devel::DProf" یک فایل خاص تولید می کند که نامیده می شود tmon.out به طور پیش فرض، و این فایل خوانده می شود
توسط برنامه "dprofpp" که قبلاً به عنوان بخشی از "Devel::DProf" نصب شده است.
توزیع اگر "dprofpp" را بدون هیچ گزینه ای فراخوانی کنید، آن را می خواند tmon.out فایل در
دایرکتوری فعلی و تولید یک گزارش آمار قابل خواندن توسط انسان از اجرای شما
برنامه توجه داشته باشید که این ممکن است کمی طول بکشد.

$> dprofpp

کل زمان سپری شده = 2.951677 ثانیه
زمان کاربر + سیستم = 2.871677 ثانیه
انحصاری تایمز
%Time ExclSec CumulS #Calls sec/call Csec/c نام
102. 2.945 3.003 251215 0.0000 0.0000 اصلی:: مسابقات
2.40 0.069 0.069 260643 0.0000 0.0000 main::debug
1.74 0.050 0.050 1 0.0500 0.0500 اصلی::گزارش
1.04 0.030 0.049 4 0.0075 0.0123 main::BEGIN
0.35 0.010 0.010 3 0.0033 0.0033 صادرکننده::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 - - نماد::شروع
0.00 - -0.000 1 - - Fcntl::BEGIN
0.00 - -0.000 1 - - Fcntl::bootstrap
0.00 - -0.000 1 - - هشدارها::BEGIN
0.00 - -0.000 1 - - IO::bootstrap
0.00 - -0.000 1 - - Getopt::Long::ConfigDefaults
0.00 - -0.000 1 - - Getopt::Long::پیکربندی
0.00 - -0.000 1 - - نماد::gensym

"dprofpp" گزارش های کاملاً دقیقی در مورد فعالیت "wordmatch" ارائه خواهد کرد.
برنامه ساعت دیواری، کاربر و سیستم، زمان ها در راس تجزیه و تحلیل قرار دارند و بعد از آن
این ستون‌های اصلی هستند که گزارش را تعریف می‌کنند. اسناد "dprofpp" را بررسی کنید
جزئیات گزینه های زیادی که پشتیبانی می کند.

همچنین "Apache::DProf" را ببینید که "Devel::DProf" را به "mod_perl" متصل می کند.

توسعه::پروفایلر
بیایید نگاهی به همان برنامه با استفاده از پروفایلر متفاوت بیندازیم: "Devel::Profiler"، a
جایگزینی فقط پرل برای "Devel::DProf". استفاده در آن بسیار کمی متفاوت است
که به جای استفاده از پرچم خاص "-d:"، "Devel::Profiler" را مستقیماً به عنوان یک
ماژول با استفاده از "-M".

$> perl -MDevel::Profiler wordmatch -f perl5db.pl

<...چند خط قطع شد...>

گزارش wordmatch برای perl5db.pl:
خطوط در پرونده: 9428
کلمات در فایل: 50243
کلمات با کاراکترهای خاص (غیر کلمه): 20480
کلمات فقط با کاراکترهای خاص (غیر کلمه): 7790
کلمات فقط با حروف صامت: 4801
کلمات فقط با حروف بزرگ: 1316
کلمات فقط با حروف صدادار: 1701

"Devel::Profiler" یک فایل tmon.out تولید می کند که با "dprofpp" سازگار است.
برنامه، بنابراین در ساخت یک برنامه آمار خوان اختصاصی صرفه جویی می شود. "dprofpp"
بنابراین استفاده با مثال بالا یکسان است.

$> dprofpp

کل زمان سپری شده = 20.984 ثانیه
زمان کاربر + سیستم = 19.981 ثانیه
انحصاری تایمز
%Time ExclSec CumulS #Calls sec/call Csec/c نام
49.0 9.792 14.509 251215 0.0000 0.0001 اصلی:: مسابقات
24.4 4.887 4.887 260643 0.0000 0.0000 main::debug
0.25 0.049 0.049 1 0.0490 0.0490 اصلی::گزارش
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::فایل::جدید
0.00 0.000 0.000 1 0.0000 0.0000 IO::دسته::جدید
0.00 0.000 0.000 1 0.0000 0.0000 نماد::gensym
0.00 0.000 0.000 1 0.0000 0.0000 IO::فایل::باز

جالب است که ما نتایج کمی متفاوت دریافت می کنیم، که بیشتر به دلیل الگوریتم است
که گزارش را تولید می کند، با وجود اینکه ظاهراً فرمت فایل خروجی بوده، متفاوت است
همسان. زمان های سپری شده، کاربر و سیستم به وضوح زمان صرف شده را نشان می دهد
"Devel::Profiler" برای اجرای اجرای خود، اما فهرست های ستونی دقیق تر به نظر می رسد
به نوعی نسبت به آنهایی که قبلاً از "Devel::DProf" داشتیم. رقم 102 درصد دارد
مثلا ناپدید شد اینجاست که باید از ابزارهایی که در اختیار داریم استفاده کنیم و
قبل از استفاده از مزایا و معایب آنها را بشناسید. جالب توجه است، تعداد تماس ها برای
هر زیر روال در دو گزارش یکسان است، این درصدها متفاوت است. مانند
نویسنده "Devel::Proviler" می نویسد:

... در حال اجرا HTML:: مجموعه آزمایشی قالب تحت Devel::DProf خروجی() را نشان می دهد
زمان نمی برد اما Devel::Profiler نشان می دهد که حدود 10 درصد از زمان در خروجی ().
من نمی دانم به کدام یک اعتماد کنم، اما قلبم به من می گوید که مشکلی وجود دارد
توسعه::DProf. HTML::Template::output() یک روال بزرگ است که مورد نیاز است
هر آزمون در هر صورت، چیزی نیاز به تعمیر دارد.

YMMV

همچنین به "Devel::Apache::Profiler" مراجعه کنید که "Devel::Profiler" را به "mod_perl" متصل می کند.

توسعه::SmallProf
نمایه ساز "Devel::SmallProf" زمان اجرای برنامه Perl شما را بررسی می کند و یک
فهرست خط به خط برای نشان دادن چند بار فراخوانی هر خط و مدت زمان هر خط
گرفت تا اجرا کند. با ارائه پرچم آشنای "-d" به Perl در زمان اجرا فراخوانی می شود.

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

<...چند خط قطع شد...>

گزارش wordmatch برای perl5db.pl:
خطوط در پرونده: 9428
کلمات در فایل: 50243
کلمات با کاراکترهای خاص (غیر کلمه): 20480
کلمات فقط با کاراکترهای خاص (غیر کلمه): 7790
کلمات فقط با حروف صامت: 4801
کلمات فقط با حروف بزرگ: 1316
کلمات فقط با حروف صدادار: 1701

"Devel::SmallProf" خروجی خود را در فایلی به نام می نویسد smallprof.out، به صورت پیش فرض. در
فرمت فایل به شکل زیر است:

:

هنگامی که برنامه خاتمه یافت، خروجی ممکن است با استفاده از هر استانداردی بررسی و مرتب شود
ابزارهای فیلتر کردن متن چیزی مانند موارد زیر ممکن است کافی باشد:

$> گربه smallprof.out | grep \d*: | مرتب سازی -k3 | tac | head -n20

251215 1.65674 7.68000 75: if ($word =~ /($regex)/ ) {
251215 0.03264 4.40000 79: debug("word: $i_wd ".($has ? 'match' :
251215 0.02693 4.10000 81: بازگشت $has;
260643 0.02841 4.07000 128: if ($debug ) {
260643 0.02601 4.04000 126: my $message = shift;
251215 0.02641 3.91000 73: my $ has = 0;
251215 0.03311 3.71000 70: $i_wd = shift;
251215 0.02699 3.69000 72: my $regex = shift;
251215 0.02766 3.68000 71: my $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: $i_cons من = مطابقت ($i_word، $word،
50243 0.48837 0.88000 63: $count{$i_LINES}{caps} =
50243 0.00516 0.88000 58: $i_caps من = مطابقت دارد ($i_word، $word، '^[(A-
50243 0.00631 0.81000 54: $i_spec من = مطابقت دارد ($i_word، $word، '[^a-
50243 0.00496 0.80000 57: $i_vows من = منطبقات ($i_word، $word،
50243 0.00688 0.80000 53: $i_word++;
50243 0.48469 0.79000 62: $count{$i_LINES}{فقط} =
50243 0.48928 0.77000 60: $count{$i_LINES}{nows} =

50243 0.00683 0.75000 55: من $i_only = مطابقت دارد ($i_word، $word، '^[^a-
فوراً می توانید تمرکز کمی متفاوت با ماژول های پروفایل زیر روال را مشاهده کنید.
و ما شروع می کنیم به اینکه دقیقاً کدام خط کد بیشترین زمان را می گیرد. آن خط regex
برای مثال کمی مشکوک به نظر می رسد. به یاد داشته باشید که این ابزارها قرار است باشند
با هم استفاده می شود، بهترین راه واحد برای نمایه کردن کد شما وجود ندارد، شما باید از بهترین آنها استفاده کنید
ابزار برای کار

همچنین به "Apache::SmallProf" مراجعه کنید که "Devel::SmallProf" را به "mod_perl" متصل می کند.

توسعه::FastProf
"Devel::FastProf" یکی دیگر از پروفایلرهای خط پرل است. این برای بدست آوردن نوشته شده است
یک نمایه‌ساز خط سریع‌تر از آنچه که برای مثال "Devel::SmallProf" ممکن است، زیرا
با "ج" نوشته شده است. برای استفاده از "Devel::FastProf"، آرگومان "-d" را به Perl ارائه دهید:

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

<...چند خط قطع شد...>

گزارش wordmatch برای perl5db.pl:
خطوط در پرونده: 9428
کلمات در فایل: 50243
کلمات با کاراکترهای خاص (غیر کلمه): 20480
کلمات فقط با کاراکترهای خاص (غیر کلمه): 7790
کلمات فقط با حروف صامت: 4801
کلمات فقط با حروف بزرگ: 1316
کلمات فقط با حروف صدادار: 1701

"Devel::FastProf" آمار را روی فایل می نویسد fastprof.out در دایرکتوری فعلی
فایل خروجی را که می توان مشخص کرد، می توان با استفاده از "fprofpp" تفسیر کرد.
برنامه خط فرمان

$> fprofpp | head -n20

فرمت خروجی # fprofpp این است:
# نام فایل: تعداد زمان خط: منبع
wordmatch:75 3.93338 251215: if ($word =~ /($regex)/ ) {
wordmatch:79 1.77774 251215: debug("word: $i_wd ".($has ? 'match' : 'n'that')." chars: /$regex/");
wordmatch:81 1.47604 251215: return $has;
wordmatch:126 1.43441 260643: my $message = shift;
wordmatch:128 1.42156 260643: if ($debug ) {
wordmatch:70 1.36824 251215: $i_wd من = shift;
wordmatch:71 1.36739 251215: my $word = shift;
wordmatch:72 1.35939 251215: my $regex = shift;

بلافاصله می توانیم ببینیم که تعداد دفعاتی که هر خط فراخوانی شده است با آن یکسان است
خروجی "Devel::SmallProf" و توالی بر اساس آن فقط کمی متفاوت است
ترتیب مدت زمان اجرای هر خط، "if ( $debug ) { " و "my
برای مثال، $message = shift;، تفاوت در زمان‌های واقعی ثبت‌شده ممکن است در باشد
الگوریتم مورد استفاده داخلی، یا ممکن است به دلیل محدودیت منابع سیستم باشد یا
مشاجره

همچنین DBIx::Profile را ببینید که پرس و جوهای پایگاه داده را که تحت "DBIx::*" اجرا می شوند، نمایه می کند.
فضای نام

توسعه دهنده::NYTProf
"Devel::NYTProf" است بعد نسل پروفایلر کد پرل، بسیاری از کاستی ها را برطرف می کند
ابزارهای دیگر و پیاده سازی بسیاری از ویژگی های جالب. اول از همه می توان آن را به عنوان یکی استفاده کرد
خط پروفایلر، الف مسدود کردن یا یک زیرروال پروفایلر، به یکباره همچنین می تواند از زیر
وضوح میکروثانیه (100 ثانیه) در سیستم هایی که "clock_gettime()" را ارائه می کنند. میتونه باشه
شروع شد و حتی با نمایه شدن برنامه متوقف شد. این یک ورودی یک خطی به نمایه است
برنامه های "mod_perl". این با "c" نوشته شده است و احتمالاً سریعترین نمایه ساز است
برای پرل موجود است. لیست خونسردی ادامه دارد. از بس، بیایید ببینیم چگونه
کار می کند - فقط از سوئیچ آشنای "-d" برای وصل کردن آن و اجرای کد استفاده کنید.

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

گزارش wordmatch برای perl5db.pl:
خطوط در پرونده: 9427
کلمات در فایل: 50243
کلمات با کاراکترهای خاص (غیر کلمه): 20480
کلمات فقط با کاراکترهای خاص (غیر کلمه): 7790
کلمات فقط با حروف صامت: 4801
کلمات فقط با حروف بزرگ: 1316
کلمات فقط با حروف صدادار: 1701

"NYTProf" یک پایگاه داده گزارش را در فایل ایجاد می کند nytprof.out به صورت پیش فرض. انسان
گزارش های قابل خواندن را می توان از اینجا با استفاده از "nytprofhtml" (HTML) ارائه شده تولید کرد
خروجی) و برنامه های "nytprofcsv" (خروجی CSV). ما از سیستم یونیکس "html2text" استفاده کرده ایم
ابزار تبدیل nytprof/index.html برای راحتی در اینجا فایل کنید

$> html2text nytprof/index.html

شاخص عملکرد
برای تطبیق کلمات
اجرا در جمعه 26 سپتامبر 13 46:39:2008
گزارش شده در جمعه 26 سپتامبر 13 47:23:2008

15 زیربرنامه برتر -- سفارش داده شده بر اساس زمان اختصاصی
|تماس |P |F |شامل|انحصاری|زیر روال |
| | | |زمان |زمان | |
|251215|5 |1 |13.09263 |10.47692 | اصلی:: | مسابقات |
|260642|2 |1 |2.71199 |2.71199 | اصلی:: | اشکال زدایی |
|1 |1 |1 |0.21404 |0.21404 |اصلی:: |گزارش |
|2 |2 |2 |0.00511 |0.00511 |XSLLoader:: |بار (xsub) |
|14 |14|7 |0.00304 |0.00298 |صادر کننده:: |واردات |
|3 |1 |1 |0.00265 |0.00254 |صادر کننده:: |به عنوان_سنگین |
|10 |10|4 |0.00140 |0.00140 |vars:: |واردات |
|13 |13|1 |0.00129 |0.00109 |ثابت:: |واردات |
|1 |1 |1 |0.00360 |0.00096 |FileHandle:: |واردات |
|3 |3 |3 |0.00086 |0.00074 |هشدار::ثبت::|واردات |
|9 |3 |1 |0.00036 |0.00036 |سخت:: |بیت |
|13 |13|13|0.00032 |0.00029 |سخت:: |واردات |
|2 |2 |2 |0.00020 |0.00020 |هشدار:: |واردات |
|2 |1 |1 |0.00020 |0.00020 | Getopt::Long:: |ParseOptionSpec|
|7 |7 |6 |0.00043 |0.00020 |سخت:: |unimport |

برای اطلاعات بیشتر به فهرست کامل 189 زیرروال مراجعه کنید.

بخش اول گزارش قبلاً اطلاعات مهمی را در مورد آن نشان می دهد
زیربرنامه ها بیشترین زمان را مصرف می کنند. در ادامه آماری در مورد منبع آورده شده است
فایل های پروفایل

فایل های کد منبع -- مرتب شده بر اساس زمان منحصر به فرد و سپس نام
|Stmts |انحصاری|میانگین. |گزارش ها |فایل منبع |
| | زمان | | | |
|2699761|15.66654 |6e-06 |خط . مسدود کردن . زیر|مطابق کلمه |
|35 |0.02187 |0.00062|خط . مسدود کردن . sub|IO/Handle.pm |
|274 |0.01525 |0.00006|خط . مسدود کردن . sub|Getopt/Long.pm |
|20 |0.00585 |0.00029|خط . مسدود کردن . sub|Fcntl.pm |
|128 |0.00340 |0.00003|خط . مسدود کردن . زیر|صادر کننده/سنگین.pm |
|42 |0.00332 |0.00008|خط . مسدود کردن . sub|IO/File.pm |
|261 |0.00308 |0.00001|خط . مسدود کردن . زیر|صادر کننده.pm |
|323 |0.00248 |8e-06 |خط . مسدود کردن . sub|constant.pm |
|12 |0.00246 |0.00021|خط . مسدود کردن . زیر|File/Spec/Unix.pm |
|191 |0.00240 |0.00001|خط . مسدود کردن . sub|vars.pm |
|77 |0.00201 |0.00003|خط . مسدود کردن . زیر|FileHandle.pm |
|12 |0.00198 |0.00016|خط . مسدود کردن . زیر|Carp.pm |
|14 |0.00175 |0.00013|خط . مسدود کردن . زیر|Symbol.pm |
|15 |0.00130 |0.00009|خط . مسدود کردن . زیر|IO.pm |
|22 |0.00120 |0.00005|خط . مسدود کردن . sub|IO/Seekable.pm |
|198 |0.00085 |4e-06 |خط . مسدود کردن . sub|warnings/register.pm|
|114 |0.00080 |7e-06 |خط . مسدود کردن . sub|sight.pm |
|47 |0.00068 |0.00001|خط . مسدود کردن . sub|warnings.pm |
|27 |0.00054 |0.00002|خط . مسدود کردن . sub|overload.pm |
|9 |0.00047 |0.00005|خط . مسدود کردن . زیر|SelectSaver.pm |
|13 |0.00045 |0.00003|خط . مسدود کردن . زیر|File/Spec.pm |
|2701595|15.73869 | | مجموع |
|128647 |0.74946 | |متوسط ​​|
| |0.00201 |0.00003|میانگین |
| |0.00121 |0.00003|انحراف |

گزارش تهیه شده توسط NYTProf 2.03 Perl profiler که توسط تیم بانس و
آدام کاپلان.

در این مرحله، اگر از اچ تی ام ال گزارش، می توانید از طریق لینک های مختلف به
هر زیر روال و هر خط کد را با مته سوراخ کنید. زیرا ما از متن استفاده می کنیم
گزارش در اینجا، و یک فهرست کامل پر از گزارش ها برای هر فایل منبع ساخته شده است،
ما فقط بخشی از متن مربوطه را نمایش خواهیم داد wordmatch-line.html فایل کافی برای
ایده ای از نوع خروجی ای که می توانید از این ابزار جالب انتظار داشته باشید ارائه دهید.

$> html2text nytprof/wordmatch-line.html

نمایه عملکرد -- -نمای بلوک-.-نمایش خطی-.-نمایش فرعی-
برای تطبیق کلمات
اجرا در جمعه 26 سپتامبر 13 46:39:2008
گزارش شده در جمعه 26 سپتامبر 13 47:22:2008

فایل wordmatch

برنامه های فرعی -- سفارش داده شده بر اساس زمان اختصاصی
|تماس |P|F|شامل|انحصاری|زیر روال |
| | | |زمان |زمان | |
|251215|5|1|13.09263 |10.47692 |main::|matches|
|260642|2|1|2.71199 |2.71199 | اصلی::|اشکال زدایی |
|1 |1|1|0.21404 |0.21404 |اصلی::|گزارش |
|0 |0|0|0 |0 |اصلی::|شروع |

|خط|Stmts.|انحصاری|میانگین. |کد |
| | | زمان | | |
|1 | | | |#!/usr/bin/perl |
|2 | | | | |
| | | | |استفاده از سخت; |
|3 |3 |0.00086 |0.00029|# 0.00003 ثانیه صرف 1 تماس با سختگیرانه:: |
| | | | |واردات |
| | | | |استفاده از هشدارها؛ |
|4 |3 |0.01563 |0.00521|# 0.00012 ثانیه صرف 1 تماس با اخطارها شد:: |
| | | | |واردات |
|5 | | | | |
|6 | | | |=head1 NAME |
|7 | | | | |
|8 | | | |filewords - تحلیل کلمه فایل ورودی |
<...قطعات...>
|62 |1 |0.00445 |0.00445|چاپ گزارش( %count ); |
| | | | |# 0.21404 ثانیه صرف 1 تماس با main::report| شد
|63 | | | | |
| | | | |# 23.56955 ثانیه (10.47692+2.61571) در |
| | | | |main::Match که 251215 بار فراخوانی شد، |
| | | | |میانگین 0.00005 ثانیه/تماس: # 50243 بار |
| | | | |(2.12134+0.51939s) در خط 57 wordmatch، میانگین|
| | | | |0.00005s/تماس شماره 50243 بار (2.17735+0.54550s) |
|64 | | | |در خط 56 wordmatch، میانگین 0.00005 ثانیه/تماس # |
| | | | |50243 بار (2.10992+0.51797s) در خط 58 از |
| | | | |wordmatch، میانگین 0.00005 ثانیه/تماس شماره 50243 بار |
| | | | |(2.12696+0.51598s) در خط 55 wordmatch، میانگین|
| | | | |0.00005s/تماس شماره 50243 بار (1.94134+0.51687s) |
| | | | |در خط 54 wordmatch، میانگین 0.00005 ثانیه/تماس |
| | | | |تطابق فرعی { |
<...قطعات...>
|102 | | | | |
| | | | |# 2.71199 ثانیه را در main::debug صرف کرد که |
| | | | |260642 بار فراخوانی شده، میانگین 0.00001 ثانیه/تماس: # |
| | | | |251215 بار (2.61571+0s) توسط main::مطابقات در |
|103 | | | |خط 74 wordmatch، میانگین 0.00001s/تماس شماره 9427 |
| | | | | بار (0.09628+0s) در خط 50 wordmatch، میانگین|
| | | | |0.00001s/تماس |
| | | | |زیر اشکال زدایی { |
|104 |260642|0.58496 |2e-06 | پیام $my = shift; |
|105 | | | | |
|106 |260642|1.09917 |4e-06 |if ($debug ) { |
|107 | | | |چاپ STDERR "DBG: $message\n"; |
|108 | | | |} |
|109 | | | |} |
|110 | | | | |
|111 |1 |0.01501 |0.01501|خروجی 0; |
|112 | | | | |

اطلاعات بسیار مفیدی در آنجا وجود دارد - به نظر می رسد این راه رو به جلو باشد.

همچنین به "Devel::NYTProf::Apache" مراجعه کنید که "Devel::NYTProf" را به "mod_perl" متصل می کند.

مرتب سازی


ماژول های پرل تنها ابزاری نیستند که یک تحلیلگر عملکرد در اختیار دارد، سیستم
ابزارهایی مانند "زمان" را نباید نادیده گرفت همانطور که مثال بعدی نشان می دهد، جایی که ما a را می گیریم
نگاهی سریع به مرتب سازی کتاب ها، پایان نامه ها و مقالات زیادی در مورد کارآمدی نوشته شده است
الگوریتم های مرتب سازی، و اینجا جایی برای تکرار چنین کاری نیست، چندین چیز خوب وجود دارد
ماژول‌های مرتب‌سازی که شایسته نگاه کردن به آن‌ها نیز هستند: "Sort::Maker"، "Sort::Key" به
ذهن با این حال، هنوز هم می توان برخی از مشاهدات خاص پرل را انجام داد
تفاسیر در مورد مسائل مربوط به مرتب سازی مجموعه داده ها و ارائه یک یا دو مثال با
با توجه به اینکه چگونه مرتب سازی حجم داده های بزرگ می تواند بر عملکرد تأثیر بگذارد. اولا، اغلب
نکته نادیده گرفته شده هنگام مرتب سازی مقادیر زیادی از داده ها، می توان تلاش کرد تا داده ها را کاهش دهد
مجموعه ای که باید با آن برخورد شود و در بسیاری از موارد "grep()" می تواند به عنوان یک فیلتر ساده بسیار مفید باشد:

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

دستوری مانند این می‌تواند حجم مطالب را برای مرتب‌سازی بسیار کاهش دهد
در وهله اول، و نباید صرفاً بر اساس آن نادیده گرفته شود
سادگی اصل "KISS" اغلب نادیده گرفته می شود - مثال بعدی از آن استفاده می کند
سیستم ساده "زمان" ابزار برای نشان دادن. بیایید نگاهی به یک مثال واقعی بیاندازیم
مرتب سازی محتویات یک فایل بزرگ، یک فایل لاگ آپاچی انجام می دهد. این یکی بیش از یک
ربع میلیون خط، 50 متر اندازه دارد، و یک تکه از آن به شکل زیر است:

# ورود به سیستم فایل

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 (سازگار؛ 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 (سازگار؛ MSIE 6.0؛ Windows NT 5.1؛ SV1)"
151.56.71.198 - - [08/Feb/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; en- US; 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 (سازگار؛ 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 (سازگار؛ 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 (سازگار؛ Konqueror/3.4؛ Linux) KHTML/3.4.0 (مانند Gecko)"
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 (سازگار؛ Konqueror/3.4؛ Linux) KHTML/3.4.0 (مانند Gecko)"
debora.to.isac.cnr.it - ​​- [08/Feb/2007:13:03:58 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (سازگار؛ Konqueror/ 3.4؛ Linux) KHTML/3.4.0 (مانند 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.1.8.0.9; rv:20061206 .1.5.0.9) Gecko/XNUMX 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 (سازگار؛ 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 (سازگار؛ 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 (سازگار؛ MSIE 6.0؛ Windows NT 5.1.NET 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 (سازگار؛ 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 .خالص"
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 پیکربندی/CLDC-1.1"

وظیفه ویژه در اینجا مرتب کردن 286,525 خط این فایل بر اساس کد پاسخ، پرس و جو،
مرورگر، آدرس ارجاع دهنده، و در آخر تاریخ. یک راه حل ممکن است استفاده از کد زیر باشد
که روی فایل های داده شده در خط فرمان تکرار می شود.

# sort-apache-log

#!/usr/bin/perl -n

سخت استفاده کنید
استفاده از هشدارها؛

اطلاعات من؛

خط:
در حالی که ( <> ) {
خط $ من = $_;
اگر (
$line =~ m/^(
([\w\.\-]+) # مشتری
\s*-\s*-\s*\[
([^]]+) # تاریخ
\]\s*"\w+\s*
(\S+) # پرس و جو
[^"]+"\s*
(\d+) # وضعیت
\s+\S+\s+"[^"]*"\s+"
([^"]*) # مرورگر
"
.*
)$/x
) {
my @chunks = split(/ +/, $line);
من $ip = $1;
تاریخ من = 2 دلار؛
من $پرسمان = $3;
من $وضعیت = $4;
my $browser = $5;

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

من @sorted = مرتب سازی {
$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]
} @داده ها؛

foreach my $data ( @sorted ) {
چاپ $data->[5];
}

خروجی 0;

هنگام اجرای این برنامه، "STDOUT" را تغییر مسیر دهید تا امکان بررسی خروجی وجود داشته باشد
از اجرای آزمایشی زیر تصحیح کنید و از ابزار "time" سیستم برای بررسی کلی استفاده کنید
زمان اجرا

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

واقعی 0m17.371s
کاربر 0m15.757s
sys 0m0.592s

اجرای برنامه بیش از 17 ثانیه ساعت دیواری طول کشید. به مقادیر مختلف "زمان" توجه کنید
خروجی، مهم است که همیشه از یک مورد استفاده کنید، و هر کدام را اشتباه نگیرید
بدان معنی است.

زمان واقعی سپری شده است
زمان کلی، یا ساعت دیواری، زمان بین زمانی که «زمان» نامیده می‌شود و زمانی که آن زمان خوانده می‌شود
خاتمه می یابد. زمان سپری شده هم زمان کاربر و سیستم و هم زمان صرف شده را شامل می شود
در انتظار سایر کاربران و فرآیندهای موجود در سیستم. به ناچار، این بیشترین است
تقریبی اندازه گیری های داده شده

زمان CPU کاربر
زمان کاربر مقدار زمانی است که کل فرآیند از طرف کاربر در آن صرف شده است
این سیستم این برنامه را اجرا می کند.

زمان CPU سیستم
زمان سیستم مقدار زمانی است که خود هسته برای اجرای روتین ها صرف کرده است یا
سیستم از طرف این کاربر فرآیند تماس می گیرد.

با اجرای همین فرآیند به عنوان «تبدیل شوارتزی» می‌توان آن را حذف کرد
آرایه های ورودی و خروجی برای ذخیره تمام داده ها، و به طور مستقیم روی ورودی کار می کنند
هم می رسد در غیر این صورت، کد تقریباً مشابه به نظر می رسد:

# sort-apache-log-schwarzian

#!/usr/bin/perl -n

سخت استفاده کنید
استفاده از هشدارها؛

چاپ

نقشه $_->[0] =>

مرتب سازی {
$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]
}
نقشه [$_, m/^(
([\w\.\-]+) # مشتری
\s*-\s*-\s*\[
([^]]+) # تاریخ
\]\s*"\w+\s*
(\S+) # پرس و جو
[^"]+"\s*
(\d+) # وضعیت
\s+\S+\s+"[^"]*"\s+"
([^"]*) # مرورگر
"
.*
)$/xo ]

=> <>;

خروجی 0;

برای بررسی زمان جدید، کد جدید را مانند فایل لاگ مشابه بالا اجرا کنید.

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

واقعی 0m9.664s
کاربر 0m8.873s
sys 0m0.704s

زمان به نصف کاهش یافته است که با هر استانداردی بهبود سرعت قابل احترامی است.
به طور طبیعی، مهم است که بررسی کنید خروجی با اولین اجرای برنامه مطابقت دارد،
اینجاست که ابزار سیستم Unix "cksum" وارد می شود.

$> cksum out-sort out-schwarz
3044173777 52029194 خارج از مرتب سازی
3044173777 52029194 خارج از شوارتز

BTW. مراقب فشار مدیرانی باشید که می بینند شما یک برنامه را تا 50 درصد سرعت می دهید
زمان اجرا یک بار، فقط برای دریافت درخواست یک ماه بعد برای انجام دوباره همان کار (داستان واقعی) -
شما فقط باید به این نکته اشاره کنید که شما فقط یک انسان هستید، حتی اگر یک برنامه نویس Perl باشید، و
خواهید دید چه کاری می توانید انجام دهید ...

عشق ورزیدن


یک بخش اساسی از هر فرآیند توسعه خوب، مدیریت مناسب خطا با آن است
پیام های آموزنده مناسبی هستند، با این حال مکتب فکری وجود دارد که
نشان می دهد که فایل های ورود باید باشد چت، گویی زنجیره خروجی ناگسستنی به نوعی
بقای برنامه را تضمین می کند. اگر سرعت به هر طریقی مشکل ساز باشد، این رویکرد وجود دارد
اشتباه.

یک نمای رایج کدی است که چیزی شبیه به این است:

logger->debug("پیام ثبت نام از طریق شناسه فرآیند: $$ INC: ". Dumper(\%INC))

مشکل این است که این کد همیشه تجزیه و اجرا می شود، حتی در صورت اشکال زدایی
سطح تنظیم شده در فایل پیکربندی ورود به سیستم صفر است. از وقتی که اشکال زدایی() زیر برنامه بوده است
وارد شد، و متغیر $debug داخلی صفر بودن را تأیید کرد، به عنوان مثال، پیام
که ارسال شده است حذف می شود و برنامه ادامه می یابد. در مثال
با این حال، هش "\%INC" قبلاً ریخته شده است، و رشته پیام
ساخته شده، که همه این کارها را می توان با یک متغیر اشکال زدایی در عبارت دور زد
سطح، مانند این:

logger->debug( "یک پیام ورود به سیستم از طریق شناسه فرآیند: $$ INC: " . Dumper(\%INC) ) if $DEBUG;

این اثر را می توان با تنظیم یک اسکریپت آزمایشی با هر دو شکل نشان داد، از جمله a
زیر روال "debug()" برای شبیه سازی عملکرد معمولی "logger()".

# ifdebug

#!/usr/bin/perl

سخت استفاده کنید
استفاده از هشدارها؛

استفاده از معیار؛
استفاده از Data::Dumper;
$DEBUG = 0;

اشکال زدایی فرعی {
my $msg = shift;

اگر ( $DEBUG ) {
چاپ "DEBUG: $msg\n"؛
}
};

timethese(100000, {
'اشکال زدایی' => فرعی {
اشکال زدایی ("یک پیام ثبت نام $0 از طریق شناسه فرآیند: $$" . Dumper(\%INC))
},
'ifdebug' => زیر {
اشکال زدایی ("یک پیام ثبت نام $0 از طریق شناسه فرآیند: $$" . Dumper(\%INC) ) if $DEBUG
},
})؛

بیایید ببینیم که "معیار" از این چه چیزی می سازد:

$> perl ifdebug
معیار: زمان بندی 100000 تکرار ثابت، زیر...
ifdebug: 0 ثانیه ساعت دیواری (0.01 usr + 0.00 sys = 0.01 CPU) @ 10000000.00/s (n=100000)
(هشدار: تکرار بسیار کم برای شمارش قابل اعتماد)
اشکال زدایی: 14 ثانیه ساعت دیواری (13.18 usr + 0.04 sys = 13.22 CPU) @ 7564.30/s (n=100000)

در یک مورد کد، که دقیقاً همان کار را با خروجی هر یک انجام می دهد
اشکال زدایی اطلاعات مربوط می شود، به عبارت دیگر هیچ چیز، 14 ثانیه طول می کشد، و در
در غیر این صورت کد یک صدم ثانیه طول می کشد. نسبتا قطعی به نظر می رسد استفاده از a
متغیر $DEBUG قبل از فراخوانی زیر روال، به جای تکیه بر هوشمند
قابلیت داخل آن

ورود به سیستم if اشکال زدایی (مقدار ثابت)
می توان با استفاده از زمان کامپایل "DEBUG" ایده قبلی را کمی جلوتر برد.
مقدار ثابت.

# ifdebug-constant

#!/usr/bin/perl

سخت استفاده کنید
استفاده از هشدارها؛

استفاده از معیار؛
استفاده از Data::Dumper;
ثابت استفاده کنید
DEBUG => 0
;

اشکال زدایی فرعی {
اگر (اشکال زدایی) {
my $msg = shift;
چاپ "DEBUG: $msg\n"؛
}
};

timethese(100000, {
'اشکال زدایی' => فرعی {
اشکال زدایی ("یک پیام ثبت نام $0 از طریق شناسه فرآیند: $$" . Dumper(\%INC))
},
'constant' => زیر {
اشکال زدایی ("یک $0 پیام ورود به سیستم از طریق شناسه فرآیند: $$" . Dumper(\%INC) ) if DEBUG
},
})؛

با اجرای این برنامه خروجی زیر تولید می شود:

$> perl ifdebug-constant
معیار: زمان بندی 100000 تکرار ثابت، زیر...
ثابت: 0 ثانیه ساعت دیواری (-0.00 usr + 0.00 sys = -0.00 CPU) @ -7205759403792793600000.00/s (n=100000)
(هشدار: تکرار بسیار کم برای شمارش قابل اعتماد)
فرعی: 14 ثانیه ساعت دیواری (13.09 usr + 0.00 sys = 13.09 CPU) @ 7639.42/s (n=100000)

ثابت "DEBUG" حتی با متغیر $debug، کف را پاک می کند و در منفی است.
صفر ثانیه، و پیام "هشدار: تکرارهای بسیار کم برای شمارش قابل اعتماد" را ایجاد می کند
وارد معامله برای اینکه ببینیم واقعاً چه اتفاقی می‌افتد، و چرا ما تکرارهای بسیار کمی داشتیم
ما فکر کردیم 100000 درخواست کرده ایم، می توانیم از "B::Deparse" بسیار مفید برای بررسی موارد جدید استفاده کنیم.
کد:

$> perl -MO=فقط ifdebug-constant

استفاده از معیار؛
استفاده از Data::Dumper;
استفاده از ثابت ('DEBUG', 0);
اشکال زدایی فرعی {
استفاده از هشدارها؛
استفاده از 'ref's سختگیرانه.
0;
}
استفاده از هشدارها؛
استفاده از 'ref's سختگیرانه.
timethese(100000, {'sub', sub{
اشکال زدایی "یک پیام ثبت نام $0 از طریق شناسه فرآیند: $$" . دامپر(\%INC)؛
}
, 'ثابت', زیر {
0;
}
})؛
ifdebug-constant syntax خوب است

خروجی نشان می دهد مقدار ثابت() زیر روال ما در حال آزمایش با مقدار جایگزین می شود
ثابت "DEBUG": صفر. خط مورد آزمایش کاملاً بهینه شده است و
شما نمی توانید بسیار کارآمدتر از آن باشید.

پست اسکریپت


این سند چندین راه را برای شناسایی نقاط داغ و بررسی ارائه کرده است
آیا هیچ تغییری زمان اجرای کد را بهبود بخشیده است.

به عنوان آخرین فکر، به یاد داشته باشید که (در زمان نوشتن) امکان تولید الف وجود ندارد
برنامه مفیدی که در زمان صفر یا منفی اجرا می شود و این اصل اساسی می تواند باشد
نوشته شده به صورت: مفید برنامه ها هستند کند طبق تعریف آنها البته ممکن است
برای نوشتن یک برنامه تقریباً آنی، اما کار زیادی انجام نمی شود، در اینجا یک برنامه بسیار
کارآمد:

$> perl -e 0

بهینه سازی این که هر چه بیشتر یک کار برای "p5p" باشد.

با استفاده از خدمات onworks.net از perlperf به صورت آنلاین استفاده کنید


سرورها و ایستگاه های کاری رایگان

دانلود برنامه های ویندوز و لینوکس

  • 1
    AstrOrzPlayer
    AstrOrzPlayer
    AstrOrz Player یک پخش کننده رسانه رایگان است
    نرم افزار، بخشی مبتنی بر WMP و VLC. این
    پخش کننده به سبک مینیمالیستی است، با
    بیش از ده رنگ تم، و همچنین می توانید
    ب ...
    AstrOrzPlayer را دانلود کنید
  • 2
    movistartv
    movistartv
    Kodi Movistar+ TV بدون ADDON برای XBMC/
    Kodi que Permite disponer de un
    رمزگشایی خدمات IPTV
    Movistar integrado en uno de los
    مراکز رسانه ای ما...
    دانلود movistartv
  • 3
    کد :: بلوک
    کد :: بلوک
    کد::Blocks یک منبع باز و رایگان است،
    کراس پلتفرم C، C++ و Fortran IDE
    ساخته شده برای پاسخگویی به بیشترین نیازها
    از کاربران آن بسیار طراحی شده است
    تمدید می کند ...
    کد دانلود::Blocks
  • 4
    در میان
    در میان
    در میان یا رابط پیشرفته Minecraft
    و Data/Structure Tracking ابزاری برای
    نمای کلی یک Minecraft را نمایش دهید
    جهان، بدون اینکه واقعاً آن را ایجاد کند. آی تی
    می توان ...
    دانلود در میان
  • 5
    MSYS2
    MSYS2
    MSYS2 مجموعه ای از ابزارها و
    کتابخانه ها به شما یک
    محیطی با کاربری آسان برای ساختمان،
    نصب و اجرای ویندوز بومی
    نرم افزار. باعث می شود ...
    MSYS2 را دانلود کنید
  • 6
    libjpeg-turbo
    libjpeg-turbo
    libjpeg-turbo یک کدک تصویر JPEG است
    که از دستورالعمل های SIMD (MMX، SSE2،
    NEON، AltiVec) برای تسریع خط پایه
    فشرده سازی JPEG و رفع فشرده سازی روشن است
    x86، x8...
    دانلود libjpeg-turbo
  • بیشتر "

دستورات لینوکس

Ad