12.06.2026
Edvinas Rudys

Kaip palengvinti ABL profiliavimą su OpenEdge ir ProPeek?

Veikimo problemų paieška ABL programose dažnai būna nelengva. Procedūra gali rodytis lėta, užklausa gali užtrukti per ilgai, arba modulis gali atlikti daugiau darbo, nei tikimasi. Tačiau be tikrų duomenų sunku tiksliai nustatyti, kur slypi problema.

Gera žinia, kad Progress OpenEdge jau turi integruotą profilerį (angl. profiler), kuris padeda pamatyti, kas vyksta programos viduje.

Šiame blogo įraše apžvelgsime, kaip sugeneruoti .prof failą naudojant PROFILER sistemos rankenėlę, kokia informacija jame saugoma, ir kaip ProPeek, „Baltic Amadeus“ sukurtas VS Code plėtinys, padeda vizualizuoti rezultatus. Vietoj naršymo per neapdorotus profiliavimo duomenis, ProPeek pateikia aiškius vaizdus, leidžiančius lengvai identifikuoti lėtas procedūras, kvietimų grandines ir kitas veikimo problemas.

Kas yra .prof failas ir kodėl jis naudingas?

Profiliavimas (angl. profiling) yra kodo veikimo laiko stebėjimo praktika. ABL virtualioji mašina (angl. ABL Virtual Machine, AVM) turi integruotą profilerį, fiksuojantį, kurie moduliai buvo paleisti, kiek kartų buvo įvykdyta kiekviena eilutė, kiek laiko užtruko kiekvienas kvietimas ir kurie moduliai kvietė vienas kitą. Šie duomenys įrašomi į .prof failą.

Kodėl tai svarbu? Nes veikimo problemas sunku išspręsti, kai dirbama remiantis spėjimais. Procedūra gali atrodyti lėta, bet ar tikroji problema yra duomenų bazės užklausa, ciklas, kuris vykdomas pernelyg daug kartų, ar kvietimas į kitą didelį modulį? Be profiliavimo duomenų lengva praleisti valandas pridedant MESSAGE sakinius ir atliekant pakeitimus, kurie realiai nieko nepagerina.

Profileris pašalina spėliojimą. Vietoj bandymo nustatyti, kur sugaištamas laikas, galima tiesiog pamatyti, kas vyksta. .prof failas saugo informaciją, reikalingą lėtoms programos vietoms identifikuoti ir skirtingų kodo dalių sąveikai suprasti. Iššūkis - tų duomenų interpretavimas, kur gali padėti tokie įrankiai kaip ProPeek .

Kaip tinkamai sugeneruoti .prof failą?

.prof failo generavimas yra nesudėtingas, tačiau svarbi veiksmų eilės tvarka. AVM turi konkrečius reikalavimus, kaip konfigūruoti PROFILER rankenėlę. Toliau pateikiama teisinga žingsnių sekos eiga:

1 žingsnis: įjunkite profilerį

PROFILER:ENABLED = TRUE.

Šis atributas turi būti nustatytas pirmiausia. Kai vėliau nustatysite PROFILER:ENABLED = FALSE, AVM automatiškai įrašys sukauptus duomenis į išvesties failą ir pašalins modulių registrą.

Pastaba: jei ABL sesija užsidaro, kol ENABLED reikšmė yra TRUE, profiliavimas automatiškai išjungiamas, kad duomenys būtų garantuotai įrašyti - taigi profiliavimo duomenys niekada nepražūsta be pėdsako.

2 žingsnis: nustatykite išvesties failo vietą

Šis atributas nustatomas iškart po ENABLED. Atributas FILE-NAME nurodo, kur bus įrašytas .prof failas.

Jei norite nurodyti aplanką, galite parašyti pilną kelią FILE-NAME

PROFILER:FILE-NAME = "C:\path\myFirstProfile.prof".

Pastaba: jei vykdote kelias profiliavimo sesijas nepakeitę FILE-NAME reikšmės, kiekviena sesija perrašys ankstesnį failą.

3 žingsnis: konfigūruokite papildomus atributus

Prieš įjungiant profiliavimą, verta nustatyti papildomus atributus. Jie nėra būtini, tačiau kai kurie iš jų yra svarbūs, todėl naudinga žinoti, kada juos taikyti:

  • PROFILER:DESCRIPTION = “”: aprašymas matomas failo antraštėje. Jį nustatyti nieko nekainuoja, o lygindami du .prof failus, aiškus aprašymas padeda greitai juos atskirti.
  • PROFILER:DIRECTORY: nustato katalogą, kuriame saugomi sąrašo (listing) failai. Jei nenurodytas, sąrašo failai saugomi dabartiniame kataloge, net jei pilnas kelias nurodytas PROFILER:FILE-NAME.
  • PROFILER:LISTINGS = TRUE: generuoja .dbg derinimo sąrašo failus kartu su .prof išvestimi. Tai svarbu: kai procedūros naudoja {include.i} failus ar preprocesoriaus direktyvas, profileriui reikia sąrašų, kad būtų galima susieti rezultatus su tikromis kodo eilutėmis (naudinga ProPeek funkcija). Be šio atributo matysite kompiliuotus eilučių numerius, o ne pirminio kodo eilutes.
  • PROFILER:COVERAGE:stebi, kurios vykdomosios eilutės buvo paleistos sesijos metu. Naudinga testų aprėpties analizei. Tikslaus eilučių susiejimo reikalauja PROFILER:LISTINGS = TRUE .
  • PROFILER:TRACE-FILTER: leidžia filtruoti, kurie moduliai įtraukiami į trasavimo išvestį, padedant valdyti failo dydį, kai TRACE-FILTER yra įjungtas.

Pastaba: yra vienas atributas, kurio oficiali dokumentacija rekomenduoja nenaudoti: PROFILER:STATISTICS. Joje nurodoma, kad šis atributas generuoja itin didelius duomenų kiekius ir jį verta naudoti tik gavus „Technical Support“ nurodymą.  

Daugiau atributų rasite čia.

4 žingsnis: įjunkite eilučių lygio profiliavimą

PROFILER:PROFILING = TRUE.

Šis atributas įjungia eilučių lygio laiko duomenų rinkimą. Jis turi būti nustatytas po aukščiau aprašytų atributų.

5 žingsnis: paleiskite savo programą

RUN myProcedure.p.

Nuo šio momento profileris veikia pasyviai fone. Jūsų programos kode papildomos instrumentacijos nereikia.

6 žingsnis: sustabdykite profiliavimą

Profiliavimą sustabdyti arba pristabdyti galima dviem būdais.

A variantas: paprastas sustabdymas

PROFILER:ENABLED = FALSE.
PROFILER:PROFILING = FALSE. 

Nustatant ENABLED = FALSE duomenys automatiškai įrašomi į failą ir profiliavimas sustoja. Tai paprasčiausias variantas vienkartinėms profiliavimo sesijoms.

B variantas: tarpiniai įrašymai

Jei norite užfiksuoti dalinius rezultatus nesustabdydami profilerio, naudokite WRITE-DATA():

PROFILER:PROFILING = FALSE. 
IF PROFILER:WRITE-DATA() THEN 
    MESSAGE "Profiler data written successfully." VIEW-AS ALERT-BOX. 
ELSE 
    MESSAGE "Failed to write profiler data." VIEW-AS ALERT-BOX. 

Metodas WRITE-DATA() grąžina TRUE, jei pavyko, arba FALSE , jei nepavyko, todėl rezultatą galite patikrinti sąlygos sakinyje. Vėliau galite vėl nustatyti PROFILER:PROFILING = TRUE ir tęsti profiliavimą.

Paprasto profiliavimo pavyzdys

Norint sugeneruoti naudingą .prof failą, svarbu suprasti, kokios informacijos tikrai reikia, ir naudoti tik būtinus atributus.

Pavyzdžiui, jei nereikia detalaus „flame graph“ vaizdo, rodančio, kiek kartų buvo iškviestas tas pats metodas, galite nustatyti PROFILER:TRACE-FILTER = "" arba visai jo nenaudoti. Šis nedidelis pakeitimas gali kelis kartus sumažinti .prof failo dydį - tai ypač naudinga dirbant su labai didelėmis profiliavimo bylomis.

Kas yra .prof failo viduje?

.prof failo struktūra atitinka „Progress AVM Profiler Output Format“ specifikaciją, kuri apibrėžia sekcijas, laukus ir versijų skirtumus, aprašytus žemiau.

.prof failas turi keletą versijų:

  • 1 versija: pradinė implementacija.
  • 2 versija yra tokia pati kaip 1 versija, tačiau rodo, kad buvo įjungtas PROFILER:STATISTICS, todėl po Code Coverage sekcijos pridedamos 4 papildomos statistikos sekcijos.
  • 3 versija: tokia pati kaip 1 versija, tačiau turi naują Call-tree sekciją po Code Coverage sekcijos ir tris nedidelius pakeitimus esamose sekcijose (aprašyta žemiau).
  • 4 versija: tokia pati kaip 3 versija, tačiau rodo, kad buvo įjungtas PROFILER:STATISTICS, todėl po Code Coverage sekcijos pridedamos 4 papildomos statistikos sekcijos.

Priklausomai nuo versijos, .prof failas yra tekstinis failas su iki aštuonių sekcijų, atskirtų taškais.

Pagrindinės .prof failo sekcijos

Header (antraštė)

Antraštė fiksuoja profiliavimo sesijos identitetą ir kontekstą. Šiai sekcijai skiriama tik viena duomenų eilutė.

Formatas:

IntegerVersion Date "Description" SystemTime ""

IntegerVersion: profilerio išvesties formato versijos numeris (1, 2, 3 arba 4).

Date: data, kai profileris buvo įjungtas, MM/DD/YYYY formatu.

Description: reikšmė, nustatyta atributu PROFILER:DESCRIPTION.

SystemTime: laikas, kada .prof failas buvo įrašytas, HH:MM:SS formatu

"" - nenaudojama eilutė. 3+ versijos failuose čia pridedamas JSON formato metaduomenų objektas su PROPATHnustatymu, bendru profiliavimo sesijos laiku ir bendru sakinių (statement) skaičiumi.

Module data (modulių duomenys)

Šioje sekcijoje surašyti visi moduliai, dalyvavę profiliavimo sesijoje, ir kiekvienam priskirtas sesijai unikalus sveikasis identifikatorius, naudojamas visose vėlesnėse sekcijose.  

Formatas:

IntegerModuleID "ModuleName" "DebugListingFile" IntegerCRCVal

IntegerModuleID: sesijai unikalus modulio identifikatorius. Visi vėlesni duomenys nurodomi šiais identifikatoriais.

ModuleName: modulio pavadinimas, panašus į funkcijos PROGRAM-NAME išvestį Progress aplinkoje.

DebugListingFile: bus tuščia, jei modulio registracijos metu PROFILER:LISTINGS reikšmė buvo False, arba jei modulis nėra išorinė procedūra ar klasės failas (tik jiems generuojami derinimo sąrašo failai).

IntegerCRCVal: RCODE-INFO:CRC reikšmė, apskaičiuota iš visų šaltinių, sudarančių .r failą; 0 moduliams, kurie nėra pagrindiniai .p ar .cls failai.

3+ versijos failuose prie kiekvieno įrašo pridedami du papildomi laukai:

LineNum: šaltinio eilutės numeris, kurioje apibrėžtas įėjimo taškas; 0 pagrindiniams .p ar .cls failams.

Signature: šiuo metu visada tuščia eilutė.

Call-graph (kvietimų grafas)

Šioje sekcijoje fiksuojamas kiekvienas kreipinio (call) ryšys, pastebėtas sesijos metu, atskleidžiant visą kvietimų topologiją: kuris modulis kvietė kurį, iš kurios eilutės ir kiek kartų.

Formatas:

CallerID CallerLineno CalleeID CallCount

CallerID: kviečiančio modulio ID; 0 reiškia pačią sesiją.

CallerLineno: eilutės numeris kviečiančiame modulyje, kurioje buvo atliktas kvietimas; kadangi šis laukas įtrauktas, keli kvietimai iš to pačio kviečiančiojo į tą pačią funkciją fiksuojami kaip atskiri įrašai.

  • CalleeID: iškviesto modulio ID.

CallCount: kiek kartų buvo įvykdyta konkreti (caller, line, callee) kombinacija.

Line Summary (eilučių suvestinė)

Šioje sekcijoje pateikiami kiekvienos sesijos metu įvykdytos eilutės vykdymo skaičiai ir laiko duomenys.

Formatas:

ModuleID LineNo ExecCount ActualTime CumulativeTime

ModuleID: modulio, kuriame yra šaltinio eilutė, identifikatorius; 0 reiškia pačią profiliavimo sesiją.

LineNo: šaltinio eilutės numeris; 0 reiškia procedūros, funkcijos, trigerio ar metodo inicijavimo ir užbaigimo papildomas išlaidas, ne konkretų ABL sakinį.

ExecCount: kiek kartų eilutė buvo įvykdyta.

ActualTime: laikas sekundėmis, sugaištas vykdant tik šią eilutę, neįskaitant iškviesto kodo laiko.

CumulativeTime: laikas sekundėmis, praėjęs vykdant šią eilutę, įskaitant visą laiką, sugaištą iškviestame kode.

ExecCount reikšmė 1, ActualTime reikšmė 0, o CumulativeTime turėtų atspindėti bendrą profiliavimo sesijos laiką. CumulativeTime galima naudoti apskaičiuojant sesijos procentus, pvz., kiek procentų sesijos laiko užėmė modulis X.

Tracing Data (trasavimo duomenys)

Pateikiama tik tuomet, kai naudojamas PROFILER:TRACING arba PROFILER:TRACE-FILTER. Šioje sekcijoje fiksuojamas vienas įrašas kiekvienam atskiram sakinio vykdymui, ne unikaliai eilutei, leidžiantis pilnai atkurti vykdymo laiko juostą. Eilutė, vykdyta 1000 kartų, sukuria 1000 įrašų.

Formatas:

ModuleID LineNo ActualTime StartTime

ModuleID: modulio, kuriame yra eilutė, identifikatorius.

LineNo: vykdyto sakinio šaltinio eilutės numeris.

ActualTime: laikas sekundėmis, sugaištas vykdant šį vienkartinį sakinio vykdymą; mikrosekundžių tikslumu.

StartTime: poslinkis sekundėmis nuo sesijos SystemTime (iš antraštės), nurodantis, kada šis vykdymas pradėtas; mikrosekundžių tikslumu.

Coverage Data (aprėpties duomenys)

Pateikiama tik tada, kai PROFILER:LISTINGS = TRUE. Šioje sekcijoje surašytas kompiliatoriaus nustatytas vykdomųjų eilučių numerių rinkinys kiekvienam modulio įėjimo taškui.

Formatas:

ModuleID "EntryName" LineCount

ModuleID: identifikuoja pagrindinę .p procedūrą arba .cls klasę iš Module Data sekcijos.

EntryName: vidinės procedūros, naudotojo apibrėžtos funkcijos, metodo ar trigerio pavadinimas; tuščia, jei įrašas aprašo pagrindinio procedūros kūno vykdomąsias eilutes.

LineCount: vykdomųjų eilučių skaičius EntryName; po antraštės eilutės sekanti tiek pat eilučių numerių įrašų.

Call-tree (kvietimų medis, tik 3+ versijoje)

Šioje sekcijoje pateikiamas hierarchinis kvietimų grandinės vaizdas su kaupiamuoju laiku kiekvienam mazgui - tai papildo plokščią Call-graph sekcijos sąrašą, parodydamas kiekvieną modulį konkrečiame kvietimo kontekste.

Formatas:

NodeID ParentNodeID ModuleID LineNum NumCalls CumulativeTime <n children NodeIds>

NodeID: unikalus kvietimų medžio mazgas. Mazgas 0 yra medžio šaknis.

ParentNodeID: kviečiančiojo mazgas kvietimų medyje.

ModuleID: šio mazgo modulio ID iš Module sekcijos.

LineNum: vykdomoji eilutės numeris tėvinio mazgo modulyje (eilutė, kurioje tėvinis modulis iškvietė šį mazgą).

NumCalls: kiek kartų šį mazgą iškvietė jo tėvinis mazgas.

CumulativeTime: visas laikas, sugaištas šiame mazge ir jo vaikiniuose mazguose.

<n children NodeIDs>:kintamas skaičius vaikinių mazgų, kuriuos šis mazgas kviečia.

Mazgas 0 yra šaknies mazgas; jo ParentNodeId, ModuleId ir LineNum yra 0; NumCalls yra 1; CumulativeTime yra visas profilerio vykdymo laikas.

User Data Section (naudotojo duomenų sekcija)

Šioje sekcijoje pateikiami laisvo teksto įrašai, kuriuos ABL programos kodas įrašo į profilerio išvestį, kviečiant PROFILER:USER-DATA() bet kuriuo sesijos metu. Ji visiškai apibrėžiama pačios programos ir naudinga pažymėti reikšmingas fazes, partijų (batch) ribas ar transakcijų identifikatorius ilgos profiliavimo sesijos metu.

Formatas:

WriteTime "UserData"

WriteTime; poslinkis sekundėmis nuo sesijos SystemTime iš antraštės, nurodantis, kada šis įrašas buvo padarytas.

UserData; eilutės reikšmė val, perduota PROFILER:USER-DATA() metodui.

Taip atrodo neapdoroto failo fragmentas:

Specialūs eilučių numeriai profiliavimo išvestyje

Žiūrint profilerio išvestį, tiesiogiai arba per ProPeek, galite pastebėti eilučių numerius, kurie neatitinka tikrų šaltinio eilučių.

Eilutė 0

Eilutė 0 reiškia modulio inicijavimo ir užbaigimo papildomas išlaidas, pvz., konstruktoriaus ar destruktoriaus kaštus. Jei modulis rodo reikšmingą laiką eilutėje 0, jis sugaišta laiką paleidimui ar užbaigimui, ne konkrečiam ABL sakiniui.

Eilutė -2

Eilutė -2, esanti 3+ versijos .prof failuose, reiškia laiką, sugaištą tame modulyje vykstant šiukšlių rinkimui (angl. garbage collection). Jei reikšmingas laikas pasirodo eilutėje -2, tas modulis gali būti šiukšlių rinkimo apkrovos šaltinis - tai naudinga tiriant atminties naudojimo elgsenas.

Modulio identifikatoriai, laiko žymos, kvietimų skaičiai ir eilučių numeriai - visa tai pasiekiama neapdorotame .prof faile. Tačiau šiuos duomenis skaityti rankiniu būdu tampa nepraktiška, kai procedūra kviečia dešimtis modulių per tūkstančius eilučių. Tai tiksliai ta sritis, kurią užpildo ProPeek.

Kaip ProPeek vizualizuoja .prof failą?

Kas yra ProPeek?

ProPeek yra „Baltic Amadeus“ sukurtas VS Code plėtinys. Jis atidaro .prof failus ir pavaizduoja juos kaip interaktyvias vizualizacijas. Vietoj neapdorotų laiko skaičių skaitymo, programuotojai gali naršyti grafikus, medžius ir palyginimo vaizdus, kurie padeda lengviau suprasti profiliavimo duomenis.

ProPeek naudingas keliais atvejais:

  • diagnozuojant lėtas procedūras;
  • suprantant kvietimų grandines;
  • lyginant veikimą prieš ir po pakeitimo;
  • pastebint netikėtas priklausomybes;
  • susipažįstant su nepažįstamu kodu.

Tai atitinka PROFILER rankenėlės tikslą - surasti kliūtis (angl. bottleneck) ir naršyti kvietimų medį, siekiant identifikuoti galimas veikimo problemas. ProPeek šį naršymą padaro vizualesnį ir intuityvesnį.

Kaip atidaryti .prof failą su ProPeek?

Jei VS Code aplinkoje jau turite įdiegtą ProPeek plėtinį, galite atidaryti .prof failą vos per kelis žingsnius:

  1. Spustelėkite dešiniuoju pelės klavišu .prof failą Explorer skydelyje.
  2. Pasirinkite “Show Profiler”.

Tai atidarys struktūruotą profiliavimo duomenų vizualizaciją ProPeek aplinkoje.

Module Details (modulio informacija)

Module Details skirtukas susideda iš trijų dalių.

Modulių sąrašas

Šioje dalyje rodomas modulių sąrašas ir jų informacija.

Paspaudus ant vieno iš modulių, žemiau esančios sekcijos pasikeičia ir parodo pasirinkto modulio statistiką.

Pastaba: Jei .prof failas sugeneruotas su PROFILER:LISTINGS = TRUE, galite dukart spustelėti modulio pavadinimą, ir atsidarys dbg_ kodas.

Kviečiantys ir kviečiami moduliai

Ryšių sekcijos rodo kvietimų grafą iš pasirinkto modulio perspektyvos:

Šią sekciją sudaro dvi dalys:

  • Calling Modules (kviečiantys moduliai): rodo, kurie moduliai kvietė pasirinktą modulį Module Details rodinyje. Tai padeda suprasti, kurie kvietimo keliai tiekia duomenis šiam moduliui, ir ar tam tikri kviečiantieji moduliai yra atsakingi už daugumą kreipinių.
  • Called Modules (kviečiami moduliai): rodo, kuriuos modulius kvietė pasirinktas modulis. Tai atskleidžia, ar šis modulis yra lengvas koordinatorius (kviečia daug kitų modulių), ar atlieka daugumą darbo pats. Jei modulis turi didelį kaupiamąjį laiką, bet mažą tiesioginį laiką, tai signalas, kad kliūtis yra jo kviečiami moduliai.

Eilučių suvestinė ir kodo peržiūra

Line Summary sekcija rodo eilutės lygio vykdymo statistiką kiekvienai pasirinkto modulio įvykdytai eilutei. Taip pat rodomas šaltinio kodas naudojant Monaco Editor - tą pačią redaktoriaus technologiją, kuri naudojama VS Code aplinkoje.

Pastaba: Ši funkcija veikia su profilerio sąrašo (listing) failais, sugeneruotais naudojant PROFILER:LISTINGS = TRUE. Ji taip pat veikia su tikraisiais šaltinio failais, jei profiliuojama programa priklauso projektui, turinčiam sugeneruotus xref failus (pvz., po kompiliavimo su Riverside OpenEdge plėtiniu). Tokiu atveju ProPeek naudoja xref informaciją, kad nustatytų tikslias modulių vietas ir eilučių numerius, įskaitant modulius, į kuriuos kreipiamasi per include failus.

Šis skirtukas naudingas, nes parodo, kurie moduliai yra „karšti“ ir kas juos kviečia, padedant tiksliai nustatyti, kurį kodą optimizuoti.

Tree View (medžio vaizdas)

Tree View rodo kvietimų medžio hierarchiją kaip skleidžiamą medį, atvaizduojantį visą programos vykdymo eigą nuo įėjimo taško iki giliausio kvietimo.

Yra dvi naudingos funkcijos:

  • Dukart spustelėjus modulį: jis atidaromas Module Details skirtuke. Tai leidžia rasti modulį medžio vaizde ir tuomet detaliai jį analizuoti.
  • Ctrl + spustelėjimas ant modulio: atidaro to modulio dbg_ kodą VS Code aplinkoje, padedantį identifikuoti galimas atminties ar veikimo problemų priežastis.

Šis skirtukas naudingas, nes atskleidžia pilną kvietimų grandinę nuo įėjimo taško iki giliausios funkcijos, padedantis suprasti, kuris vykdymo kelias veda prie kliūties.

Pastaba: 3+ versijos profilerio failams šis vaizdas sukonstruojamas iš Call-tree sekcijos. 1 versijos failams ProPeek atkuria hierarchiją iš Tracing Data sekcijos, naudodamas tą pačią vykdymo trasavimo informaciją, kuri naudojama ir detaliam Flame Graph generuoti.

Flame Graph

Naudingos funkcijos:

  • Flame Graph:šis vizualizavimo tipas rodo funkcijų ir metodų kvietimus, kur kiekvienas horizontalus blokas reiškia kvietimą, o jo plotis - jam sugaištą laiką. Blokai sukrauti vertikaliai, rodydami kvietimų hierarchiją - aukštesni stulpeliai reiškia gilesnius įdėtinius kvietimus. Paspaudus ant bloko, jį galima išplėsti per visą grafiko plotį, kad būtų lengviau analizuoti to vykdymo kelio funkcijas ir metodus.
  • Search Type (paieškos tipas)
    • Length: rodo standartinį flame graph vaizdą.
    • Constructor or Destructor: paryškina konstruktorių ir destruktorių kvietimus, pritemdydamas visus kitus blokus, kad būtų lengviau sutelkti dėmesį į objektų sukūrimą ir naikinimą kvietimų hierarchijoje.
    • Search: leidžia ieškoti modulio pagal pavadinimą, parodo atitinkančių mazgų skaičių ir paryškina atitinkamus blokus grafike.
  • Graph Type (grafiko tipas)
    • Summary: flame graph rodo bendrą to pačio metodo laiką, jei jis buvo kviestas kelis kartus iš eilės.
    • Detailed: rodo kiekvieną kvietimą kaip atskirą mazgą ir išlaiko tikslius laiko duomenis. Summary grafike vaikiniai moduliai visada pradedami nuo tėvinio modulio kairiojo krašto, nes rodomas tik bendras vykdymo laikas. Detailed grafike vaikiniai moduliai rodomi savo tikroje vykdymo padėtyje, todėl vaikinis kvietimas gali pradėti arti tėvinio modulio pabaigos, jei buvo iškviestas vėliau jo gyvavimo cikle.

Pastaba: Jei informacijos nepakanka detaliam flame graph sugeneruoti, pasirodys šis pranešimas:

Šis skirtukas naudingas, nes vizualizuoja laiko sąnaudas kaip bloko plotį, iškart parodydamas tikrąsias kliūtis, be papildomų skaičiavimų.

Compare (palyginimas)

Šis skirtukas leidžia detaliai palyginti du .prof failus vienoje vietoje.

Šį skirtuką galima atidaryti dviem būdais:

  1. Compare skirtukas: jei ProPeek aplinkoje jau atidarytas .prof failas, atidarykite Compare skirtuką. Atsidarys failų naršyklė, kurioje galėsite pasirinkti antrąjį .prof failą.
  2. Dešinio klavišo meniu: spustelėkite dešiniuoju pelės klavišu .prof failą ir pasirinkite “Compare Profilers”. Atsidarys failų naršyklė antrajam .prof failui pasirinkti.

Šis skirtukas naudingas, nes leidžia įvertinti, ar kodo pakeitimas tikrai pagerino veikimą, ar sukėlė netikėtų regresijų.

Relationship Graph (ryšių grafikas)

Relationship Graph pavaizduoja kvietimų topologiją kaip orientuotą grafą, parodantį visą programos priklausomybių struktūrą vienoje, naršomoje vizualizacijoje.

Grafo struktūra:

Mazgai (Nodes): kiekvienas mazgas reiškia unikalų modulį (procedūrą, klasę ar metodą).

Ryšiai (Edges): kiekvienas orientuotas ryšys reiškia kvietimą iš vieno modulio į kitą. Rodyklė nukreipta nuo kviečiančiojo į kviečiamąjį.

Mazgo dydis: didesni mazgai reiškia modulius su didesniu kaupiamuoju laiku (sunaudojančius didesnę bendrų profiliavimo kaštų dalį).

Ryšio storis: storesni ryšiai reiškia daugiau kvietimų tarp dviejų modulių (didesnį vykdymo skaičių tame kvietimo kelyje).

Pastaba: Šis grafas tiesiogiai atitinka .prof failo 3 sekciją (Call-graph) - neapdorotus kvietimų topologijos duomenis. Relationship Graph yra jos vizuali, naršoma forma.

Šis skirtukas padeda:

  • Pastebėti netikėtas priklausomybes: didelėse ABL kodo bazėse kvietimų grandinės retai būna akivaizdžios skaitant kodą. Relationship Graph leidžia iš karto pamatyti priklausomybių struktūrą.
  • Rasti optimizavimo taikinius: centriniai moduliai, nuo kurių priklauso visa kita, yra geri optimizavimo kandidatai. Dažnai kviečiamo pagalbinio modulio optimizavimas naudingas visai programai.
  • Atlikti pagrindinės priežasties analizę: jei flame graph rodo lėtą kvietimų grandinę, Relationship Graph padeda ją susekti iki įėjimo taško.

Nuo neapdorotų profiliavimo duomenų prie praktinių įžvalgų

OpenEdge profileris yra galingas įrankis, kuris jau pasiekiamas ABL programuotojams. Jis suteikia duomenis, reikalingus programos veikimui suprasti ir optimizuoti. Tačiau neapdorotas .prof failas gali būti sudėtingas, sunkiai interpretuojamas ir lengvai klaidingai suprantamas.

ProPeek padeda šią spragą užpildyti.

Sujungus tinkamą .prof generavimą su ProPeek interaktyviomis vizualizacijomis, profiliavimas tampa kur kas praktiškesnis tyrimo procesas. Flame Graph parodo, kur sugaištamas laikas. Relationship Graph atskleidžia programos struktūrą. Compare režimas padeda įvertinti kodo pakeitimų poveikį.

Jei jums kada teko spėlioti, kur slypi veikimo problema, ar sugaišti valandas optimizuojant netinkamą kodą, profiliavimas padeda sutelkti dėmesį į tikrąją problemą. Su ProPeek šis procesas tampa daug prieinamesnis ABL programuotojams.

„Baltic Amadeus“ padeda komandoms optimizuoti ir modernizuoti Progress OpenEdge programas, identifikuoti veikimo kliūtis ir palengvinti sudėtingų ABL sistemų priežiūrą. Susipažinkite su mūsų Progress OpenEdge paslaugomis.

Pasikalbėkime apie jūsų projektą

Pradedate projektą arba norite sustiprinti jau vykdomą? Susisiekite ir atsakysime jums per vieną darbo dieną.

Parašykite mums

Ačiū! Jūsų pateikimas gautas!
Oi! Pateikiant formą kažkas nutiko.