Я выпусціў Devel:: NYTProf v3 напярэдадні Раства 2009 года. На працягу наступных некалькіх месяцаў некалькі больш магчымасцяў былі дададзеныя. V3 працы былі звязаны з цалкам перапісана падпраграма Profiler і цяжкай працы на многае іншае. У той момант я адчуваў, што я зрабіў дастаткова з NYTProf на дадзены момант, і прыйшоў час засяродзіцца на іншых больш надзённых праектаў.
За гэтыя месяцы я таксама пачаў працаваць над паляпшэннямі для PostgreSQL PL / Perl. Гэты праект ператварыўся ў нешта эпічнае прыгода з больш, чым сваю долю узлётаў і падзенняў і узлётаў і падзенняў. Пыл толькі урэгуляванні цяпер. Я б блогу пра гэта, але ўзніклі пытанні бяспекі, якія прывялі каманду PostgreSQL разгледзець магчымасць адмены plperl мова цалкам. На шчасце, я быў у стане дапамагчы пазбегнуць гэтага, выдаліўшы Safe.pm цалкам! У нейкі момант я спадзяюся напісаць паведамленне ў блогу годны шлях. Між тым, калі вы карыстаецеся PostgreSQL, вы сапраўды хочаце абнавіць да апошняга рэлізу.
Адна з маіх мэтаў у павышэнні PostgreSQL PL / Perl было палепшыць інтэграцыю з NYTProf. Я хацеў, каб мець магчымасць профілю PL / Perl кода, убудаванага ў сервер базы дадзеных. З PostgreSQL 8.4 я магу атрымаць Profiler для запуску, з некаторымі фурманка, запрэжаная валамі, але ў дакладзе падпраграм былі __ANON__ і вы не змаглі ўбачыць зыходны код, так што не было заявы таймінгаў. Гэта было бескарысна.
Ключавая праблема ў тым, што Devel:: NYTProf не мог бачыць у радок evals правільна. Каб выправіць становішча, я павінен быў вярнуцца спелеалогія глыбока ў кішкі NYTProf зноў у асноўным у мадэлі дадзеных і генерацыі кода дакладу. З NYTProf v4, радок evals ў цяперашні час разглядаюцца як файлы, у асноўным, і зусім новы ўзровень разумення з'яўляецца адкрылі!
У астатняй частцы гэтай пасадзе я буду апісання гэтай і іншых новых функцый.
Давайце пачнем з разгляду на невялікі прыклад:
perl -d:NYTProf -e 'eval("sub { $_ }")->() for 1,2,2'
Гэта выконвае тры радкі evals, кожны з якіх вызначае ананімных падпраграму, якая затым выконваецца. Два з трох evals маюць аднолькавы зыходны код.
З NYTProf 3,11 даклад " -e
файл "выглядаў наступным чынам:
Два ключавых моманту, каб адзначыць: Па-першае, няма ніякай сувязі для бурэння-уніз, каб убачыць фактычны зыходны код выконваецца EVAL. (У дадзеным прыкладзе мы можам бачыць крыніца, але гэта рэдка.) Па-другое, тры ананімных падпраграм былі аб'яднаныя. Вы не можаце бачыць асобныя дэталі, як выклік лічыць, абаненты, або таймінгі.
(У выпадку, калі вам цікава, галоўная:: BEGIN падпраграмы вызначаецца як пабочны эфект загрузкі NYTProf, і галоўная:: Runtime падпраграма манекена створаныя NYTProf дзейнічаць у якасці "корань выклікае" Вы ўбачыце. выгляд, як выклікае ананімных субтытры, у позні скрыншот).
З NYTProf 4,00 жа дакладзе выглядае наступным чынам:
Цяпер вы можаце бачыць нашмат больш падрабязна тут. Два evals з ідэнтычнымі зыходным кодам былі аб'яднаныя, так як маюць ідэнтычныя ананімныя падпраграмы вызначаецца імі. EVAL і ананімныя поўдзень з розным зыходным кодам былі захоўвацца асобна. Тое, што вы не можаце лёгка бачыць з малюнкаў з'яўляецца тое, што " string eval
"тэкстаў у шэры анатацыі спасылкі. Гэта тое, дзе гэта становіцца ўсё больш цікавым...
Пры націску на " 2 string evals (merged)
"спасылка вядзе нас да тыповых даклад NYTProf старонка Паказаны прадукцыйнасці анатаваны зыходны код выконваецца EVAL:
Што вы глядзіце на тут зыходны код, які ніколі не існаваў у выглядзе файла. (Гэта другая радок, якая змяшчае кропку з коскай дадалі Perl як частка рэалізацыі eval
).
У табліцы ў верхняй частцы, вы ўбачыце "Eval Выклікаецца У" са спасылкай, што вазьму цябе да EVAL заявай, што выконваецца гэты код. Вы таксама ўбачыце "Роднага брата evals" радкі. Вось дадаў у тых выпадках, калі EVAL была запушчана некалькі разоў, і не ўсе былі аб'яднаны ў адзіны даклад. Нарэшце, таму, што гэтая EVAL ўключае ў сябе дадзеныя аб'яднаныя з іншымі, даклад ўключае ў сябе дакладнае банэр папярэджвае аб тым, колькі evals былі аб'яднаны для атрымання гэтай старонцы справаздачы.
Абнаўленне: Вы будзеце мець патрэбу ў апошняй версіі Perl (5.8.9 +, + 5.10.1, або 5,12 +), каб убачыць EVAL зыходнага кода.
Так чаму ж NYTProf пайсці на ўсе намаганні зліцця evals і ананімныя субтытры? Вось рэальны прыклад выкарыстання профілю perlcritic :
Без зліцця гэтых 4196 evals дало б 4196 старонак справаздачы! Іх вялікі аб'ём робячы іх практычна бескарыснымі. Зараз гэта ясна з дакладу, што толькі некалькі асобных радкоў зыходнага кода выкарыстоўваюцца і справаздач для кожнага з іх значна больш карысныя.
У гэтым прыкладзе perlcritic збірае мноства дробных фрагментаў кода. Многія прыкладання выкарыстоўваюць радок EVAL сабраць вялікую колькасць кода. Модуль ORLite з'яўляецца адным з прыкладаў. Ён дынамічна генеруе і складае большую частку кода са шматлікімі падпраграм, якія рэалізуюць індывідуальны інтэрфейс для канкрэтных SQLite файла базы дадзеных.
З NYTProf 3,11 вы не маглі бачыць сотні радкоў зыходнага кода, або, якая выклікае падпраграмы прадукцыйнасць у разліку, або індывідуальнай работы заявай. Усё, што вам было відаць, спіс катэгорый званкоў і агульны час, праведзены ў кожнай:
Гэта было лепш, чым нічога, але зараз, з NYTProf v4, вы можаце убачыць усе !
Як усё гэта працуе правільна, асабліва мадэлі дадзеных маніпуляцый, неабходных для зліцця evals і ананімныя падпраграмы, была значна больш балюча, чым я чакаў. Я як блаславіў і пракляў тэстаў на шматлікія выпадкі жыцця!
Я думаю, было б разумна для NYTProf справаздачнасці і мадэлі дадзеных код для чытання дадзеных з, і маніпуляваць дадзенымі ў, базы дадзеных SQLite., Што прывядзе да больш просты ў суправаджэнні кода. Было б таксама дазволіць nytprofhtml, якія будуць выкарыстоўвацца для прадстаўлення даных аб прадукцыйнасці з іншых крыніц, у тым ліку ў perl6.
Калі вы зацікаўлены ў супрацоўніцтве па гэтым пытанні, пачынаючы з утылітай для загрузкі nytprof.out файл у SQLite базе дадзеных, калі ласка, звяртайцеся ў спіс рассылкі.
Там у невялікай агаворкай, варта адзначыць аб таймінгаў паказаны для струннага evals, якія вызначаюць падпраграм.
Таймінгі для струннага evals ўзятыя з заявы Profiler (падпраграма Profiler не звярнуць увагу на evals). Такім чынам, "час, выдаткаваны на выкананне EVAL" з'яўляецца сумай час, выдаткаваны на выкананне якіх-небудзь заяў у EVAL.
Гэта добра для evals, якія не вызначаюць падпраграм. Для тых, хто, час для EVAL ўключае ў сябе не толькі час, выдаткаваны на выкананне EVAL сябе, але і час, выдаткаваны на выкананне заявы ў падпраграмы вызначаецца ў EVAL але называецца пазней з-за яго межамі.
Таму асцярожную фармулёўку вы можаце бачыць на прыкладзе з perlcritic паказана раней:
# Правёў 2.65s Выкананне інструкцый ў 1369 evals радок (аб'яднаныя) # Уключае 1.83s выдаткаваны на выкананне 122015 званкоў да 1 да поўдня вызначаны ў ім.
Я мог бы аўтаматычна адымаецца падпраграмы час ад EVAL часу, але я баяўся гэтага зрабіць (чаму-то, што ў цяперашні час выслізгвае ад мяне). Можа быць, змяню ў найбліжэйшай будучыні. Далей, будучыя версіі NYTProf можа выкарыстоўваць падпраграму логікі Profiler часу evals. Гэта глыбокае змяненне, якое дасць больш натуральны выгляд на таймінгі.
BEGIN
падводных лодак, так BEGIN (або use
) у радку 3 будзе называцца BEGIN@3
і так трымаў адрозніваецца ад іншых у тым жа пакеце. NYTProf v4 прымае, што далейшае шляхам выяўлення рэдкіх выпадках, калі змена назвы не з'яўляецца унікальным і дадання парадкавага нумара да яе, як BEGIN@3.59
. perl -c
) можа быць таксама прафіляваныя. POSIX::_exit
функцыі выхадаў працэсу непасрэдна, без прамыўкі stdio буфераў і не даючы Perl шанец, каб вымыцца. Гэта азначае, што NYTProf не атрымаў шанцу, каб скончыць і профіль быў не прыдатны для выкарыстання. NYTProf v4 зараз перахапляе выклікі POSIX::_exit
і чысціць правільна. --minimal
-м) опцыя робіць nytprofhtml прапусціць стварэнне справаздач для рэдка "блокі" і "'узроўняў катэгорый падрабязна і прапускае генерацыі GraphViz. (кропка файлаў. Гэта эканоміць шмат часу. Атрымлівайце асалоду!