From 7e0c8e20b52789f46f65ad0f0c0e6f88484569d0 Mon Sep 17 00:00:00 2001 From: Bastien Jansen Date: Thu, 5 Oct 2023 21:51:54 +0200 Subject: [PATCH] fix: format durations using BigDecimal to sort values as numbers instead of strings (fixes #655) --- .../plugin/profiler/ExpertProfilerTableDataModel.java | 10 ++++------ .../plugin/profiler/SimpleProfilerTableDataModel.java | 8 ++++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/antlr/intellij/plugin/profiler/ExpertProfilerTableDataModel.java b/src/main/java/org/antlr/intellij/plugin/profiler/ExpertProfilerTableDataModel.java index 32075d3f..a03975df 100644 --- a/src/main/java/org/antlr/intellij/plugin/profiler/ExpertProfilerTableDataModel.java +++ b/src/main/java/org/antlr/intellij/plugin/profiler/ExpertProfilerTableDataModel.java @@ -4,15 +4,15 @@ import org.antlr.v4.runtime.atn.DecisionInfo; import org.antlr.v4.runtime.atn.ParseInfo; -import java.text.DecimalFormat; -import java.text.NumberFormat; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.LinkedHashMap; public class ExpertProfilerTableDataModel extends ProfilerTableDataModel { public ParseInfo parseInfo; public LinkedHashMap nameToColumnMap = new LinkedHashMap<>(); public static final String[] columnNames = { - "Decision", "Invocations", "Time", "# DFA states", "LL failover", "Total k", + "Decision", "Invocations", "Time (ms)", "# DFA states", "LL failover", "Total k", "Min SLL k", "Min LL k", "Max SLL k", "Max LL k", "DFA k", "SLL-ATN k", "LL-ATN k", "Full context", "Ambiguities", "Predicates" @@ -37,8 +37,6 @@ public class ExpertProfilerTableDataModel extends ProfilerTableDataModel { "# of predicate evaluations" }; - // microsecond decimal precision - private final NumberFormat milliUpToMicroFormatter = new DecimalFormat("#.###"); private final String[] ruleNamesByDecision ; public ExpertProfilerTableDataModel(ParseInfo parseInfo, Parser parser) { @@ -77,7 +75,7 @@ public Object getValueAt(int row, int col) { case 1: return decisionInfo.invocations; case 2: - return milliUpToMicroFormatter.format(decisionInfo.timeInPrediction / (1000.0 * 1000.0)); + return BigDecimal.valueOf(decisionInfo.timeInPrediction / (1000.0 * 1000.0)).setScale(3, RoundingMode.HALF_DOWN); case 3: return parseInfo.getDFASize(decision); case 4: diff --git a/src/main/java/org/antlr/intellij/plugin/profiler/SimpleProfilerTableDataModel.java b/src/main/java/org/antlr/intellij/plugin/profiler/SimpleProfilerTableDataModel.java index b3c74495..4433738f 100644 --- a/src/main/java/org/antlr/intellij/plugin/profiler/SimpleProfilerTableDataModel.java +++ b/src/main/java/org/antlr/intellij/plugin/profiler/SimpleProfilerTableDataModel.java @@ -4,15 +4,15 @@ import org.antlr.v4.runtime.atn.DecisionInfo; import org.antlr.v4.runtime.atn.ParseInfo; -import java.text.DecimalFormat; -import java.text.NumberFormat; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.LinkedHashMap; public class SimpleProfilerTableDataModel extends ProfilerTableDataModel { public ParseInfo parseInfo; public LinkedHashMap nameToColumnMap = new LinkedHashMap<>(); public static final String[] columnNames = { - "Rule","Invocations", "Time", "Total k", "Max k", "Ambiguities", "DFA cache miss" + "Rule","Invocations", "Time (ms)", "Total k", "Max k", "Ambiguities", "DFA cache miss" }; public static final String[] columnToolTips = { @@ -63,7 +63,7 @@ public Object getValueAt(int row, int col) { case 1: return decisionInfo.invocations; case 2: - return decisionInfo.timeInPrediction/(1000.0 * 1000.0); + return BigDecimal.valueOf(decisionInfo.timeInPrediction / (1000.0 * 1000.0)).setScale(3, RoundingMode.HALF_DOWN); case 3: return decisionInfo.LL_TotalLook+decisionInfo.SLL_TotalLook; case 4: