Back to site

NYTProf v4 - Цяпер радок-Eval бачанне рэнтгенаўскага!

Я выпусціў 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 ў цяперашні час разглядаюцца як файлы, у асноўным, і зусім новы ўзровень разумення з'яўляецца адкрылі!

У астатняй частцы гэтай пасадзе я буду апісання гэтай і іншых новых функцый.

Бачачы ў радок Evals

Давайце пачнем з разгляду на невялікі прыклад:

perl -d:NYTProf -e 'eval("sub { $_ }")->() for 1,2,2'

Гэта выконвае тры радкі evals, кожны з якіх вызначае ананімных падпраграму, якая затым выконваецца. Два з трох evals маюць аднолькавы зыходны код.

З NYTProf 3,11 даклад " -e файл "выглядаў наступным чынам:

NYTProf EVAL-Sub example1 311.png

Два ключавых моманту, каб адзначыць: Па-першае, няма ніякай сувязі для бурэння-уніз, каб убачыць фактычны зыходны код выконваецца EVAL. (У дадзеным прыкладзе мы можам бачыць крыніца, але гэта рэдка.) Па-другое, тры ананімных падпраграм былі аб'яднаныя. Вы не можаце бачыць асобныя дэталі, як выклік лічыць, абаненты, або таймінгі.

(У выпадку, калі вам цікава, галоўная:: BEGIN падпраграмы вызначаецца як пабочны эфект загрузкі NYTProf, і галоўная:: Runtime падпраграма манекена створаныя NYTProf дзейнічаць у якасці "корань выклікае" Вы ўбачыце. выгляд, як выклікае ананімных субтытры, у позні скрыншот).

З NYTProf 4,00 жа дакладзе выглядае наступным чынам:

NYTProf EVAL-Sub example1 400.png

Цяпер вы можаце бачыць нашмат больш падрабязна тут. Два evals з ідэнтычнымі зыходным кодам былі аб'яднаныя, так як маюць ідэнтычныя ананімныя падпраграмы вызначаецца імі. EVAL і ананімныя поўдзень з розным зыходным кодам былі захоўвацца асобна. Тое, што вы не можаце лёгка бачыць з малюнкаў з'яўляецца тое, што " string eval "тэкстаў у шэры анатацыі спасылкі. Гэта тое, дзе гэта становіцца ўсё больш цікавым...

Пры націску на " 2 string evals (merged) "спасылка вядзе нас да тыповых даклад NYTProf старонка Паказаны прадукцыйнасці анатаваны зыходны код выконваецца EVAL:

NYTProf EVAL-Sub example1 eval.png

Што вы глядзіце на тут зыходны код, які ніколі не існаваў у выглядзе файла. (Гэта другая радок, якая змяшчае кропку з коскай дадалі Perl як частка рэалізацыі eval ).

У табліцы ў верхняй частцы, вы ўбачыце "Eval Выклікаецца У" са спасылкай, што вазьму цябе да EVAL заявай, што выконваецца гэты код. Вы таксама ўбачыце "Роднага брата evals" радкі. Вось дадаў у тых выпадках, калі EVAL была запушчана некалькі разоў, і не ўсе былі аб'яднаны ў адзіны даклад. Нарэшце, таму, што гэтая EVAL ўключае ў сябе дадзеныя аб'яднаныя з іншымі, даклад ўключае ў сябе дакладнае банэр папярэджвае аб тым, колькі evals былі аб'яднаны для атрымання гэтай старонцы справаздачы.

Абнаўленне: Вы будзеце мець патрэбу ў апошняй версіі Perl (5.8.9 +, + 5.10.1, або 5,12 +), каб убачыць EVAL зыходнага кода.

Так чаму ж NYTProf пайсці на ўсе намаганні зліцця evals і ананімныя субтытры? Вось рэальны прыклад выкарыстання профілю perlcritic :

NYTProf EVAL-Sub perlcritic1.png

Без зліцця гэтых 4196 evals дало б 4196 старонак справаздачы! Іх вялікі аб'ём робячы іх практычна бескарыснымі. Зараз гэта ясна з дакладу, што толькі некалькі асобных радкоў зыходнага кода выкарыстоўваюцца і справаздач для кожнага з іх значна больш карысныя.

У гэтым прыкладзе perlcritic збірае мноства дробных фрагментаў кода. Многія прыкладання выкарыстоўваюць радок EVAL сабраць вялікую колькасць кода. Модуль ORLite з'яўляецца адным з прыкладаў. Ён дынамічна генеруе і складае большую частку кода са шматлікімі падпраграм, якія рэалізуюць індывідуальны інтэрфейс для канкрэтных SQLite файла базы дадзеных.

З NYTProf 3,11 вы не маглі бачыць сотні радкоў зыходнага кода, або, якая выклікае падпраграмы прадукцыйнасць у разліку, або індывідуальнай работы заявай. Усё, што вам было відаць, спіс катэгорый званкоў і агульны час, праведзены ў кожнай:

NYTProf 311.png EVAL-Sub cpangraph

Гэта было лепш, чым нічога, але зараз, з NYTProf v4, вы можаце убачыць усе !

Акрамя...

Я бачу, SQLite на адлегласці

Як усё гэта працуе правільна, асабліва мадэлі дадзеных маніпуляцый, неабходных для зліцця evals і ананімныя падпраграмы, была значна больш балюча, чым я чакаў. Я як блаславіў і пракляў тэстаў на шматлікія выпадкі жыцця!

Я думаю, было б разумна для NYTProf справаздачнасці і мадэлі дадзеных код для чытання дадзеных з, і маніпуляваць дадзенымі ў, базы дадзеных SQLite., Што прывядзе да больш просты ў суправаджэнні кода. Было б таксама дазволіць nytprofhtml, якія будуць выкарыстоўвацца для прадстаўлення даных аб прадукцыйнасці з іншых крыніц, у тым ліку ў perl6.

Калі вы зацікаўлены ў супрацоўніцтве па гэтым пытанні, пачынаючы з утылітай для загрузкі nytprof.out файл у SQLite базе дадзеных, калі ласка, звяртайцеся ў спіс рассылкі.

String Eval таймінгі

Там у невялікай агаворкай, варта адзначыць аб таймінгаў паказаны для струннага evals, якія вызначаюць падпраграм.

Таймінгі для струннага evals ўзятыя з заявы Profiler (падпраграма Profiler не звярнуць увагу на evals). Такім чынам, "час, выдаткаваны на выкананне EVAL" з'яўляецца сумай час, выдаткаваны на выкананне якіх-небудзь заяў у EVAL.

Гэта добра для evals, якія не вызначаюць падпраграм. Для тых, хто, час для EVAL ўключае ў сябе не толькі час, выдаткаваны на выкананне EVAL сябе, але і час, выдаткаваны на выкананне заявы ў падпраграмы вызначаецца ў EVAL але называецца пазней з-за яго межамі.

Таму асцярожную фармулёўку вы можаце бачыць на прыкладзе з perlcritic паказана раней:

 # Правёў 2.65s Выкананне інструкцый ў 1369 evals радок (аб'яднаныя)
# Уключае 1.83s выдаткаваны на выкананне 122015 званкоў да 1 да поўдня вызначаны ў ім. 

Я мог бы аўтаматычна адымаецца падпраграмы час ад EVAL часу, але я баяўся гэтага зрабіць (чаму-то, што ў цяперашні час выслізгвае ад мяне). Можа быць, змяню ў найбліжэйшай будучыні. Далей, будучыя версіі NYTProf можа выкарыстоўваць падпраграму логікі Profiler часу evals. Гэта глыбокае змяненне, якое дасць больш натуральны выгляд на таймінгі.

Іншыя змены ў v4

Атрымлівайце асалоду!

Published (Last edited): Apr 15 , source: http://blog.timbunce.org/2010/06/09/nytprof-v4-now-with-string-eval-x-ray-vision/