You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by fs...@apache.org on 2017/02/18 14:06:36 UTC

svn commit: r1783556 - /jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java

Author: fschumacher
Date: Sat Feb 18 14:06:36 2017
New Revision: 1783556

URL: http://svn.apache.org/viewvc?rev=1783556&view=rev
Log:
Make GUI more responsive when it gets a lot of events.
Convert Aggregate Graph to use a queue, when new rows are to be inserted.
Update the model (or at least notify the gui) only periodically.
That way we get the update of the model out of the busy path of the swing
event loop.

Bugzilla Id: 60687

Modified:
    jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java

Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java?rev=1783556&r1=1783555&r2=1783556&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java Sat Feb 18 14:06:36 2017
@@ -33,9 +33,11 @@ import java.text.DecimalFormat;
 import java.text.Format;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Deque;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
@@ -58,6 +60,7 @@ import javax.swing.JTabbedPane;
 import javax.swing.JTable;
 import javax.swing.JTextField;
 import javax.swing.SwingConstants;
+import javax.swing.Timer;
 import javax.swing.UIManager;
 import javax.swing.border.Border;
 import javax.swing.border.EmptyBorder;
@@ -254,6 +257,8 @@ public class StatGraphVisualizer extends
 
     private Pattern pattern = null;
 
+    private Deque<SamplingStatCalculator> newRows = new ConcurrentLinkedDeque<>();
+
     public StatGraphVisualizer() {
         super();
         model = createObjectTableModel();
@@ -422,20 +427,17 @@ public class StatGraphVisualizer extends
             matcher = pattern.matcher(sampleLabel);
         }
         if ((matcher == null) || (matcher.find())) {
-            JMeterUtils.runSafe(false, () -> {
-                    SamplingStatCalculator row = null;
-                    synchronized (lock) {
-                        row = tableRows.get(sampleLabel);
-                        if (row == null) {
-                            row = new SamplingStatCalculator(sampleLabel);
-                            tableRows.put(row.getLabel(), row);
-                            model.insertRow(row, model.getRowCount() - 1);
-                        }
-                    }
-                    row.addSample(res);
-                    tableRows.get(TOTAL_ROW_LABEL).addSample(res);
-                    model.fireTableDataChanged();
+            SamplingStatCalculator row = tableRows.computeIfAbsent(sampleLabel, label -> {
+                SamplingStatCalculator newRow = new SamplingStatCalculator(label);
+                newRows.addLast(newRow);
+                return newRow;
             });
+            synchronized (row) {
+                row.addSample(res);
+            }
+            synchronized (lock) {
+                tableRows.get(TOTAL_ROW_LABEL).addSample(res);
+            }
         }
     }
 
@@ -514,6 +516,14 @@ public class StatGraphVisualizer extends
 
         this.add(mainPanel, BorderLayout.NORTH);
         this.add(spane, BorderLayout.CENTER);
+        new Timer(500, e -> {
+                synchronized (lock) {
+                    while (!newRows.isEmpty()) {
+                        model.insertRow(newRows.pop(), model.getRowCount() - 1);
+                    }
+                }
+                model.fireTableDataChanged();
+        }).start();
     }
 
     public void makeGraph() {