11package org .dflib .jjava .kernel .magics ;
22
3+ import org .dflib .jjava .jupyter .instrumentation .WallAndCpuTimer ;
34import org .dflib .jjava .jupyter .instrumentation .WallTimer ;
45import org .dflib .jjava .jupyter .kernel .BaseKernel ;
56import org .dflib .jjava .jupyter .kernel .display .DisplayData ;
67import org .dflib .jjava .jupyter .kernel .magic .CellMagic ;
78import org .dflib .jjava .jupyter .kernel .magic .LineMagic ;
89import org .dflib .jjava .kernel .JavaKernel ;
910
11+ import java .lang .management .ManagementFactory ;
12+ import java .lang .management .ThreadMXBean ;
1013import java .util .List ;
1114import java .util .UUID ;
1215
@@ -28,14 +31,25 @@ public DisplayData eval(JavaKernel kernel, List<String> args, String body) throw
2831 }
2932
3033 private DisplayData timeAndRunCode (JavaKernel kernel , String code ) {
31- System . out . println ( "TimeMagic thread: " + Thread . currentThread (). getName () );
34+ ThreadMXBean threadMXBean = ManagementFactory . getThreadMXBean ( );
3235 return kernel .evalBuilder (code )
3336 .resolveMagics ()
3437 .renderResults ()
35- .timed (new TMWallTimer (kernel ))
38+ .timed (WallAndCpuTimer .canMeasureCpuTimes (threadMXBean )
39+ ? new TMWallAndCpuTimer (kernel , threadMXBean )
40+ : new TMWallTimer (kernel ))
3641 .eval ();
3742 }
3843
44+ private static void displayCpuTime (BaseKernel kernel , long userTimeNanos , long sysTimeNanos , long totalTimeNanos ) {
45+ String cpuTimes = String .format ("CPU times: user %.3f s, sys %.3f s, total %.3f s" ,
46+ userTimeNanos / NANONS_IN_SEC ,
47+ sysTimeNanos / NANONS_IN_SEC ,
48+ totalTimeNanos / NANONS_IN_SEC );
49+
50+ kernel .display (new DisplayData (cpuTimes ).setDisplayId (UUID .randomUUID ().toString ()));
51+ }
52+
3953 private static void displayWallTime (BaseKernel kernel , long wallTimeNanos ) {
4054 String wallTime = String .format ("Wall time: %.3f s" , wallTimeNanos / NANONS_IN_SEC );
4155 kernel .display (new DisplayData (wallTime ).setDisplayId (UUID .randomUUID ().toString ()));
@@ -53,4 +67,24 @@ protected void onStop(long wallTimeNanos) {
5367 displayWallTime (kernel , wallTimeNanos );
5468 }
5569 }
70+
71+
72+ static class TMWallAndCpuTimer extends WallAndCpuTimer {
73+ private final BaseKernel kernel ;
74+
75+ public TMWallAndCpuTimer (BaseKernel kernel , ThreadMXBean threadMXBean ) {
76+ super (threadMXBean );
77+ this .kernel = kernel ;
78+ }
79+
80+ @ Override
81+ protected void onStop (long wallTimeNanos , long userTimeNanos , long totalTimeNanos ) {
82+ // sanity check: CPU and user times can't be measured sometimes
83+ if (userTimeNanos != -1 && totalTimeNanos != -1 ) {
84+ displayCpuTime (kernel , userTimeNanos , totalTimeNanos - userTimeNanos , totalTimeNanos );
85+ }
86+
87+ displayWallTime (kernel , wallTimeNanos );
88+ }
89+ }
5690}
0 commit comments