X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.utils.thread%2Fsrc%2Forg%2Fsimantics%2Futils%2Fthreads%2Flogger%2FThreadLogVisualizer.java;h=5a1bb23fbdb13b3ba9c517cd7cea3b9bbf662ba3;hb=f002990cb02c4842cdc992395117958f75fff68c;hp=53d1a029d439617258d0d93c2265542325d8a14f;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.utils.thread/src/org/simantics/utils/threads/logger/ThreadLogVisualizer.java b/bundles/org.simantics.utils.thread/src/org/simantics/utils/threads/logger/ThreadLogVisualizer.java index 53d1a029d..5a1bb23fb 100644 --- a/bundles/org.simantics.utils.thread/src/org/simantics/utils/threads/logger/ThreadLogVisualizer.java +++ b/bundles/org.simantics.utils.thread/src/org/simantics/utils/threads/logger/ThreadLogVisualizer.java @@ -27,17 +27,40 @@ import java.util.Map; public class ThreadLogVisualizer { // Do not show tasks shorter than 5ms - final public static long DISCARD_LIMIT = 0; + final public static long DISCARD_LIMIT = 2 * 1000 * 1000; // 1s columns final public static long COLUMN_WIDTH = 1000000000; + final int onlyOneThread = -1; + + final String colors[] = { + "#53c0a7", + "#ca49a1", + "#64b74e", + "#a159ca", + "#b6b345", + "#656bc5", + "#da943b", + "#5e99d3", + "#d1592b", + "#418a53", + "#e16182", + "#777d34", + "#ca89ca", + "#b7754c", + "#9e4b6b", + "#cb4347" + }; + class Task implements Comparable { String name; long beginTime; long endTime; long threadId; + long combined = 0; public Task(String name, long threadId, long beginTime, long endTime) { + if(name.length() > 100) name = name.substring(0, 99); this.name = name; this.threadId = threadId; this.beginTime = beginTime; @@ -55,16 +78,48 @@ public class ThreadLogVisualizer { ArrayList tasks = new ArrayList(); + private boolean acceptThread(long threadId) { + if(onlyOneThread == -1) return true; + else return (threadId&15) == onlyOneThread; + } + + private Map compositeTasks = new HashMap<>(); + public void read(DataInput input) { try { while(true) { try { - String taskName = input.readUTF(); + String taskName = input.readUTF(); long threadId = input.readLong(); long beginTime = input.readLong(); long endTime = input.readLong(); - if((endTime-beginTime) > DISCARD_LIMIT) - tasks.add(new Task(taskName, threadId, beginTime, endTime)); + if(!acceptThread(threadId)) continue; + if((endTime-beginTime) > DISCARD_LIMIT) { + tasks.add(new Task(taskName, threadId, beginTime, endTime)); + Task t = compositeTasks.remove(threadId); + if(t != null) { + if((t.endTime-t.beginTime) > DISCARD_LIMIT) { + tasks.add(new Task(t.combined + " small tasks", t.threadId, t.beginTime, t.endTime)); + } + } + } else { + Task t = compositeTasks.get(threadId); + if(t == null) { + t = new Task("", threadId, beginTime, endTime); + compositeTasks.put(threadId, t); + } + if(beginTime - t.endTime > DISCARD_LIMIT) { + tasks.add(new Task(t.combined + " small tasks", t.threadId, t.beginTime, t.endTime)); + t = new Task("", threadId, beginTime, endTime); + compositeTasks.put(threadId, t); + } + t.endTime = endTime; + t.combined++; + if((t.endTime-t.beginTime) > DISCARD_LIMIT) { + tasks.add(new Task(t.combined + " small tasks", t.threadId, t.beginTime, t.endTime)); + compositeTasks.remove(threadId); + } + } } catch(EOFException e) { break; } @@ -143,18 +198,19 @@ public class ThreadLogVisualizer { (task.beginTime-minTime)*timeScale, (r+1)*rowHeight); s.printf(locale, - "\n", + "\n", (task.beginTime-minTime)*timeScale, r*rowHeight, (task.endTime-task.beginTime)*timeScale, rowHeight); } for(Task task : lane.tasks) { + int time = (int)(1e-6 * (task.endTime-task.beginTime)); s.printf(locale, "%s\n", (task.endTime-minTime)*timeScale, (r+0.8)*rowHeight, - task.name); + Integer.toString(time) + "ms: " + task.name); } } s.println(""); @@ -209,7 +265,7 @@ public class ThreadLogVisualizer { (task.beginTime-minTime)*timeScale, (r+1)*rowHeight); s.printf(locale, - "\n", + "\n", (task.beginTime-minTime)*timeScale, r*rowHeight, (task.endTime-task.beginTime)*timeScale, @@ -263,7 +319,7 @@ public class ThreadLogVisualizer { (task.beginTime-minTime)*timeScale, (r+1)*rowHeight); s.printf(locale, - "\n", + "\n", (task.beginTime-minTime)*timeScale, r*rowHeight, (task.endTime-task.beginTime)*timeScale,