From eacdc424bc94953b30053a45712f4675ba7a8bba Mon Sep 17 00:00:00 2001 From: pajjilykk Date: Thu, 23 Apr 2026 10:36:51 +0700 Subject: [PATCH] idk --- export.py | 65 ++++++++++++++++++++++++++++++++++++++++++----- log.txt | 64 +++++++++++++++++++++++----------------------- process_log.xlsx | Bin 5725 -> 7357 bytes 3 files changed, 90 insertions(+), 39 deletions(-) diff --git a/export.py b/export.py index 27d6e53..5e7cb4a 100644 --- a/export.py +++ b/export.py @@ -3,9 +3,11 @@ import argparse import re import sys from dataclasses import dataclass +from decimal import Decimal from typing import Dict, Iterable, List, Tuple from openpyxl import Workbook +from openpyxl.chart import BarChart, Reference from openpyxl.styles import Font @@ -18,8 +20,10 @@ LINE_RE = re.compile( class ProcessLog: pid: int ppid: int - start: float - finish: float | None = None + start: Decimal + start_text: str + finish: Decimal | None = None + finish_text: str | None = None first_seen_order: int = 0 @@ -65,16 +69,23 @@ def parse_processes(lines: Iterable[str]) -> Dict[int, ProcessLog]: event, pid_s, ppid_s, _depth_s, _l_s, _r_s, ts_s = m.groups() pid = int(pid_s) ppid = int(ppid_s) - ts = float(ts_s) + ts = Decimal(ts_s) if event == "START": processes[pid] = ProcessLog( - pid=pid, ppid=ppid, start=ts, finish=None, first_seen_order=order + pid=pid, + ppid=ppid, + start=ts, + start_text=ts_s, + finish=None, + finish_text=None, + first_seen_order=order, ) order += 1 else: if pid in processes: processes[pid].finish = ts + processes[pid].finish_text = ts_s return processes @@ -113,29 +124,69 @@ def tree_rows(processes: Dict[int, ProcessLog]) -> List[Tuple[int, ProcessLog]]: return ordered +def fmt6(value: Decimal) -> str: + return f"{value.quantize(Decimal('0.000001'))}" + + def export_excel(rows: List[Tuple[int, ProcessLog]], output_path: str) -> None: wb = Workbook() ws = wb.active ws.title = "process_logs" - ws.append(["PPID", "PID", "START", "FINISH", "DURATION"]) + ws.append(["PPID", "PID", "START", "TIME_FROM_START", "FINISH", "DURATION"]) for cell in ws[1]: cell.font = Font(bold=True) + base_start = min((node.start for _, node in rows), default=Decimal("0")) + for depth, node in rows: if node.finish is None: continue + if node.finish_text is None: + continue + + time_from_start = node.start - base_start duration = node.finish - node.start pid_display = f"{' ' * depth}{node.pid}" - ws.append([node.ppid, pid_display, node.start, node.finish, duration]) + ws.append( + [ + node.ppid, + pid_display, + node.start_text, + fmt6(time_from_start), + node.finish_text, + fmt6(duration), + ] + ) ws.column_dimensions["A"].width = 12 ws.column_dimensions["B"].width = 20 ws.column_dimensions["C"].width = 18 ws.column_dimensions["D"].width = 18 - ws.column_dimensions["E"].width = 14 + ws.column_dimensions["E"].width = 18 + ws.column_dimensions["F"].width = 14 ws.freeze_panes = "A2" + last_row = ws.max_row + if last_row >= 2: + chart = BarChart() + chart.type = "bar" + chart.grouping = "stacked" + chart.overlap = 100 + chart.gapWidth = 150 + chart.legend.position = "b" + chart.width = 15 + chart.height = 7.5 + chart.x_axis.scaling.orientation = "maxMin" + + data = Reference(ws, min_col=4, max_col=4, min_row=2, max_row=last_row) + duration = Reference(ws, min_col=6, max_col=6, min_row=2, max_row=last_row) + chart.add_data(data, titles_from_data=False) + chart.add_data(duration, titles_from_data=False) + chart.series[0].graphicalProperties.noFill = True + + ws.add_chart(chart, "D21") + wb.save(output_path) diff --git a/log.txt b/log.txt index 913ac00..36246d9 100644 --- a/log.txt +++ b/log.txt @@ -1,36 +1,36 @@ Before: -61348 28446 8318 49147 24393 15112 24969 66655 3374 5666 48922 778 11600 6589 6406 56105 71867 17651 21741 7869 +53295 80896 89602 86224 55926 84615 87294 48381 55123 61994 34359 93902 43309 3589 29660 26380 61249 28170 39563 82507 -START PID=44192 PPID=44191 depth=0 range=[0,19999] time=1776745157.209104 -START PID=44193 PPID=44192 depth=1 range=[0,9999] time=1776745157.209289 -START PID=44194 PPID=44192 depth=1 range=[10000,19999] time=1776745157.209369 -START PID=44195 PPID=44193 depth=2 range=[0,4999] time=1776745157.209470 -START PID=44197 PPID=44193 depth=2 range=[5000,9999] time=1776745157.209540 -START PID=44196 PPID=44194 depth=2 range=[10000,14999] time=1776745157.209546 -START PID=44198 PPID=44194 depth=2 range=[15000,19999] time=1776745157.209581 -START PID=44199 PPID=44195 depth=3 range=[0,2499] time=1776745157.209631 -START PID=44200 PPID=44197 depth=3 range=[5000,7499] time=1776745157.209689 -START PID=44201 PPID=44196 depth=3 range=[10000,12499] time=1776745157.209717 -START PID=44202 PPID=44195 depth=3 range=[2500,4999] time=1776745157.209722 -START PID=44204 PPID=44197 depth=3 range=[7500,9999] time=1776745157.209779 -START PID=44205 PPID=44196 depth=3 range=[12500,14999] time=1776745157.209848 -START PID=44203 PPID=44198 depth=3 range=[15000,17499] time=1776745157.209874 -END PID=44200 PPID=44197 depth=3 range=[5000,7499] time=1776745157.209961 -END PID=44199 PPID=44195 depth=3 range=[0,2499] time=1776745157.210015 -END PID=44201 PPID=44196 depth=3 range=[10000,12499] time=1776745157.210100 -END PID=44202 PPID=44195 depth=3 range=[2500,4999] time=1776745157.210110 -END PID=44204 PPID=44197 depth=3 range=[7500,9999] time=1776745157.210143 -END PID=44205 PPID=44196 depth=3 range=[12500,14999] time=1776745157.210214 -END PID=44203 PPID=44198 depth=3 range=[15000,17499] time=1776745157.210242 -END PID=44195 PPID=44193 depth=2 range=[0,4999] time=1776745157.210294 -END PID=44197 PPID=44193 depth=2 range=[5000,9999] time=1776745157.210304 -END PID=44196 PPID=44194 depth=2 range=[10000,14999] time=1776745157.210415 -START PID=44206 PPID=44198 depth=3 range=[17500,19999] time=1776745157.210418 -END PID=44193 PPID=44192 depth=1 range=[0,9999] time=1776745157.210535 -END PID=44206 PPID=44198 depth=3 range=[17500,19999] time=1776745157.210718 -END PID=44198 PPID=44194 depth=2 range=[15000,19999] time=1776745157.210864 -END PID=44194 PPID=44192 depth=1 range=[10000,19999] time=1776745157.211079 -END PID=44192 PPID=44191 depth=0 range=[0,19999] time=1776745157.211362 +START PID=53571 PPID=53570 depth=0 range=[0,19999] time=1776746459.289786 +START PID=53572 PPID=53571 depth=1 range=[0,9999] time=1776746459.290028 +START PID=53573 PPID=53571 depth=1 range=[10000,19999] time=1776746459.290119 +START PID=53574 PPID=53572 depth=2 range=[0,4999] time=1776746459.290256 +START PID=53576 PPID=53572 depth=2 range=[5000,9999] time=1776746459.290432 +START PID=53575 PPID=53573 depth=2 range=[10000,14999] time=1776746459.290464 +START PID=53577 PPID=53573 depth=2 range=[15000,19999] time=1776746459.290645 +START PID=53578 PPID=53574 depth=3 range=[0,2499] time=1776746459.290676 +START PID=53580 PPID=53576 depth=3 range=[5000,7499] time=1776746459.290855 +END PID=53578 PPID=53574 depth=3 range=[0,2499] time=1776746459.291082 +END PID=53580 PPID=53576 depth=3 range=[5000,7499] time=1776746459.291298 +START PID=53579 PPID=53574 depth=3 range=[2500,4999] time=1776746459.291487 +START PID=53584 PPID=53577 depth=3 range=[17500,19999] time=1776746459.291494 +START PID=53582 PPID=53577 depth=3 range=[15000,17499] time=1776746459.291486 +START PID=53583 PPID=53575 depth=3 range=[10000,12499] time=1776746459.291497 +START PID=53581 PPID=53576 depth=3 range=[7500,9999] time=1776746459.291592 +END PID=53584 PPID=53577 depth=3 range=[17500,19999] time=1776746459.292012 +END PID=53579 PPID=53574 depth=3 range=[2500,4999] time=1776746459.292020 +END PID=53581 PPID=53576 depth=3 range=[7500,9999] time=1776746459.292094 +END PID=53582 PPID=53577 depth=3 range=[15000,17499] time=1776746459.292094 +END PID=53583 PPID=53575 depth=3 range=[10000,12499] time=1776746459.292159 +END PID=53576 PPID=53572 depth=2 range=[5000,9999] time=1776746459.292532 +START PID=53585 PPID=53575 depth=3 range=[12500,14999] time=1776746459.292517 +END PID=53585 PPID=53575 depth=3 range=[12500,14999] time=1776746459.293104 +END PID=53574 PPID=53572 depth=2 range=[0,4999] time=1776746459.293576 +END PID=53572 PPID=53571 depth=1 range=[0,9999] time=1776746459.294079 +END PID=53577 PPID=53573 depth=2 range=[15000,19999] time=1776746459.294508 +END PID=53575 PPID=53573 depth=2 range=[10000,14999] time=1776746459.294684 +END PID=53573 PPID=53571 depth=1 range=[10000,19999] time=1776746459.295034 +END PID=53571 PPID=53570 depth=0 range=[0,19999] time=1776746459.295429 After: -4 10 13 28 36 40 54 55 59 62 68 78 81 81 83 85 90 91 91 92 +0 5 5 10 16 20 22 22 28 50 56 56 57 59 60 61 77 79 81 83 diff --git a/process_log.xlsx b/process_log.xlsx index 434c96415b66ed13671c46bb5a9cc38f355944e2..b1936b03a04d48707f7eb7a7e3374ae0a0afdbf1 100644 GIT binary patch delta 3772 zcmai1XH-+!8V$WekPaec=t`(c@14+*W~f4_0i=vXL2g7rdJ92e0AVN^stTbQDbhje z01gT$peUh(6anD{e9k;suJv+r*16yPvDdfvcg{ZFnY!>oiQWQAM$QTXfv7>ePHFV5 z)Vxj@N4rg7kF+rf;0?w|*9r26;_bWbLg2dY^;&OJ9%23E>AYG5FLl7#xuZ=l7H|QZ%kj*z~GDTez@Nl71%+L-7nMhlrc$-*sd|F>{$%1o>CJk1$RiW!LNK! zvFx?#e!jmmyj6H45?b*ze4lB~CSPKAE0DnQztk~~S&lisfhj?t98nO6g(wITQT>hN zJSF3?AYp3b$zRDqpgu12C2Bq(%P-`OB5TZ1e3u4)rbo|xdTBKG1KDaHIiaaz10ITG)$=Rg48RTWJ@Pv)7v@naf8SmER4d%o%b@Ubcfb~~VH ztwzzrAJOb$FDey2?0n4=EgLzL;&>odteK~*ljEPhjyH>+EZq(8eK+$~c>9Wx%7@jv zd<3+6nL~ew<$Ck?+&rG)U+;Lv7u z*lftb#zy07%HofZ(^8tN8Ow9&**>}Fng?%9j9?OgWWRH4 z3mQGPOOLL*!eC7aF4j*Wj4n6K6LBO8dROXz3LOQ`J`BRyPwAnvWKy-z>R}4dT&Qjd zF0xE@*1Al=C{J5wS6|3hV>dKRJAVG}tSDbr=c>=LoeQbBmQTRbSTA&`qP>lrV~ii; zo2rVwG;Hn%Q%a3^AH_3c7UO|pnag}lXc3owHWdOJ|x&OmvbtAn~yvw(XCsIMj%~8XWsI4%MdSTBdt!k zbf_D;r2E}C9G}(!wO!A)3!Kbzuw{wT^u8FRUdbwOM$`NES$4^S)S0Up0($DP;~s|0 zZIm^knozbHT`j1_z1llaf%{1k0{C=xtY=8(G2#!J;a9w59jBA$Xw)()ec9YC`mDG7v89$UFInr)r z3nk-wS;nGJ)}bENdq7M;%U9$&(ljQvp`>(?3Hgn#xV5=NUUPxNM^L;0>LiAlR}Ok^ zo1z^9Bv{7Wy&VHZ3$zl{zK~72qIkrvsZj)6vst0ExTKqHPdkm0p{_EUoQG`W^Ysyt zMFcK)XNu_PCaJ_+YvFMw{_k;2rutkJFM|s_c%dAWpkP7gb}x*WfKeH^Ekkw*}zIL~vvLAmjG_nnxr?d8M`(fzux-fNH)0)VA% zlZIPc>qT&ssP>L@P!GV}=ekFEKN|FQ=`)t)PCC4(FU8yu(<7!(t<}mKZ9DZlk1GVy z>0lMpq82?o!l3$B2`S&cQu(FOrrzDgWX7d5L8m9xd1Q!%8bZ?oD7-N!v#}z2_{ti_W)FHtv07i1Yz%nu88S`F;J135BXR**4OndbMh0gxtGoN~SDC zk{-Jn>SHIRXxUULan=Jb$bAH9D`jrB!b4~Csv9pKU~%4_SD3qy>~CK#Ug?pjimevb zG0p167N#(neiKV`;hj>ix=RxYXmTcDs;Hf5&Y1;rM7Wf8r~Gv;j#s&{Kq#X>d4&*? z-j9&lz!e5OYnDOly9j%~CX;ey;_7Bz?ng^re8a_z@UxEK%e=lsNQ64CZS@yd!$(3e zz6Te2}}lMj`}s-a$+ zr3usY&0$o5Mz-%wkwd^BalA67YFJg3>MKcMPzJ@Q?hUtL z)c$s*I`s8r=21nz?zzd^FAKV=!rSP6rXz}5n@c9r`0_8Eu)tuy5N|j5l!H=(6?xZO=KW^lV{~a6KFIDix)z6fp{m%>G5~e0+ zxAnS~uq!e=CPgbAoaX-Foe}b`sRq_2gY8GLmVS?RxyJ}fqkPf>S?3^}U>0~Aj%qS9 z?5o3b&oHgT5T+YBDquy!17#&Vh{y-{r(wc4dYJ6g7ZI1f53xHqZljP0DR*zTU?Q25 z>4ZkbWz#?&0r0o;D-u=#9m%6-ZOMBoK9*9Qw}j!keCe06Z?X^38`T{(Ej>$i-?6rV zv^4E_BIR0)UyvE|33{t6s(f*5GsQv0$F-kKPcZHR@Yr#$N}5rv-iM>KI&1x3YjuJy zK6FW7%&9Uy0CZE>C4{>idSV46d!o`|`3e+$WthSVviGK#*JCDP6IS&pN~T&$x2Iup zvIrw1uf3PA3@)TT{lfYldEdrj|H<`OGSZ8CZi($a6!<^RP=yLth>=au0aqWX8 zlk9B=eD=*LT_{iNiJ%QWBmC#}8`f`?eaDYm*P=DGQ0lrC^yY zOK}KI)d5eyT${rDy^nFOenU>PwxmL4e4QGg&vNjmiR;q~&U-D%I5BwQxR}ur2doOP zEHTjT$Wo$&u>`#&feSzcpDmid6km6z6X#;+Fc!IaKe?@anzrZ;MR}#4<73%ToMrx< zH;QIhX^~WJ7$~@wpeIV^Ju9Gd6v64Fnb~0cVaNucWxnA@b2z9{QQViO&mN`gncpLq zjxz|Op6a~#88)Lj<7BvqXJMU4vjRY*T9C5ZE3U(LO!N(3|Vk z3hO*#d$~6a*m<27P14}t-;k_5ptOLJkg}5fxRGES^}9?BF+_#?i33a=AhZOl_&>K4 zG>lc@xGov28mAle8CJ!UQk_1WjxmmZC=yeKll}V3qv~`Tr+xT4#xY6>Y@mQz(ksfhIkvt;S=R406i#`RDLWD_WLsziz9+&17G5W%eCa{S?f3p~cXB&3^rxs%0^TK@e1=lB2p&hL57dEVzd&pGes`MjTVJ}-{NkbwjaD+G}T000X3 zd!|V=L;XE7yqAVZpVJ2P$ZwqO9q>l#N7OY;#99q6HI#YM{(a+Uef2{_FVSm=_Vvx5 z?~mz8h<|kIVM)r@7FAB;Cuq-~zL4rdgS4z}o0cd;ZQ|<9EL&Pk7d4cv?pdSvw8D`r zR=i}&bE_`y{NqZLe#^nY-4sVgJTmf#`VO(#6GMy=B9;h|8 zFvIinJWw9vJCXJ;{0TSZ7a<6K#8DLAS$HIAAaeCMW!^WNu`cgV!>12^84|2&^cCt3 z)_Qy?{FIcDUX2-UNPVIvIR4;b5T|tWbOV$m-1y6x4E}rR8Qyojb2VWi0FbK#0CHP_ zLGqmRMqi#R>j2>(? z=4Ep9#M|}mU3-rmx}MO6bqf~H>dIlbD~57Om6$hSD3#x)7L#7+lFKSc3yVo)Ml`-G zeSEE|^V5*rbo4+PFXZ|r*`mI|n_~=lLK}(92MEaCo3^806 zk>C>P{-tyys-aJ>WT`*DV>4`yyqa%B)a8DBztSI+iGN%7ihQ{mxrlv4m|I%@!664s z`|?~4%>;j&|4KS(*#1D0TI;1%ejJrQK7mJ=|ji-`jv0 zT-f|PxPO)kePtyRt<)R<@o9gb3v*1ty&cTkM1iVV|FuljfglJ zwv+e?lNyyS(a55?E7k|xgs}yS>-hGcY2HvxgL9#qNW|x`?N=pJjDvftqF?5(>_-jL8>jt_--BJMrTdt2P4p zK>{95@Y1VMv4B%_z;INkNZx&WDeJ(z92kT3Elydehibb!;WUiU9JtQS7HlO%fM|k&iSFQ@C$zKdCZw5Y} zq_Y2T(`ASOS;O|qw-5KL#oxh%<_On^jaM$7an7O?!fM72>neEVCceES9alqz(PLqB zQM42~QBZbD7eZI`LZ=s6CP#4?+I`})!B4v$MJR)xa_oI|%-Zrsf3F``r!w_b?P2%q zmXbiq+GhJ@%@NFI1x*7QD;A!Z@SNfTu|vCx?|ew+^Kh@J$WdwuV~;3ZInRv{j*_kZ z!Q{U8hgcS#qphq!<~iy()8akQRD{)lqH*H$ukw;O=BR=YlMO2Vz18|!J8D;mGgN4P zl(&=mF3OQ{jwL!y3+Ab|GJL>|ewA-rVOM)PD2ocV&YHKN`)+zuZd$OjhpD~<1Z9Iu zK1s~=LoTR88;Ne2mOACiA!BQ{xMk?4aZ=N-rkl(~Dd_|b1v0B{_$4IsdMp0o?YI$p zPx~S2@f57x8~V}L;b|YhqnRaWM)LSheaR?}FA3qHEP9(ebOb(J;LTu!}Gs z{{2c7#dFcnuSb=@6npkk&ZCR{(1dl~y*8y6u6<*IJU+^o#_$|f#7S@+wwvh*F`dM%(~nLgu{Zs@mJM-~9Q>