Skip to content

Commit 70467b5

Browse files
committed
GH-85 filter a flat profile for sampled CPU snapshot using its instrumentation filter
1 parent 9efce02 commit 70467b5

File tree

8 files changed

+83
-14
lines changed

8 files changed

+83
-14
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Manifest-Version: 1.0
22
OpenIDE-Module: org.graalvm.visualvm.lib.jfluid/2
33
OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/lib/jfluid/Bundle.properties
4-
OpenIDE-Module-Specification-Version: 2.1
4+
OpenIDE-Module-Specification-Version: 2.2
55

visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/ResultsSnapshot.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
package org.graalvm.visualvm.lib.jfluid.results;
4545

46+
import org.graalvm.visualvm.lib.jfluid.ProfilerEngineSettings;
4647
import org.graalvm.visualvm.lib.jfluid.utils.StringUtils;
4748
import java.io.DataInputStream;
4849
import java.io.DataOutputStream;
@@ -136,4 +137,8 @@ private void debugValues() {
136137
LOGGER.finest("beginTime: " + beginTime); // NOI18N
137138
LOGGER.finest("timeTaken: " + timeTaken); // NOI18N
138139
}
140+
141+
// used by LoadedSnapshot when loading from file
142+
public void setProfilerSettings(ProfilerEngineSettings pes) {
143+
}
139144
}

visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/CPUCCTContainer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,7 @@ protected FlatProfileContainer postGenerateFlatProfile() {
540540
invPerMethodId = null;
541541
methodsOnStack = null;
542542

543+
fpc.filterOriginalData(cpuResSnapshot.filter);
543544
return fpc;
544545
}
545546

visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/CPUResultsSnapshot.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@
5757
import java.util.ResourceBundle;
5858
import java.util.WeakHashMap;
5959
import java.util.logging.Level;
60+
import org.graalvm.visualvm.lib.jfluid.ProfilerEngineSettings;
6061
import org.graalvm.visualvm.lib.jfluid.client.ClientUtils;
62+
import org.graalvm.visualvm.lib.jfluid.filters.InstrumentationFilter;
63+
import org.graalvm.visualvm.lib.jfluid.global.CommonConstants;
6164
import org.graalvm.visualvm.lib.jfluid.results.CCTNode;
6265
import org.graalvm.visualvm.lib.jfluid.results.FilterSortSupport;
6366
import org.graalvm.visualvm.lib.jfluid.utils.Wildcards;
@@ -163,6 +166,7 @@ public static class NoDataAvailableException extends Exception {
163166
protected PrestimeCPUCCTNode[] rootNode; // Per-view root nodes
164167
protected CPUCCTContainer[][] threadCCTContainers; // [method|class|package aggregation level][0-nThreads] -> CPUCCTContainer
165168
protected boolean collectingTwoTimeStamps;
169+
protected InstrumentationFilter filter;
166170

167171
// Number of instrumented methods - may be smaller than the size of the above arrays
168172
protected int nInstrMethods;
@@ -179,9 +183,19 @@ public CPUResultsSnapshot() { // No-arg constructor needed for above serializati
179183
public CPUResultsSnapshot(long beginTime, long timeTaken, CPUCCTProvider cctProvider, boolean collectingTwoTimestamps,
180184
String[] instrClassNames, String[] instrMethodNames, String[] instrMethodSigs, int nInstrMethods)
181185
throws NoDataAvailableException {
186+
this(beginTime, timeTaken, cctProvider,
187+
collectingTwoTimestamps, null,
188+
instrClassNames, instrMethodNames, instrMethodSigs, nInstrMethods);
189+
}
190+
191+
public CPUResultsSnapshot(long beginTime, long timeTaken,
192+
CPUCCTProvider cctProvider, boolean collectingTwoTimestamps, InstrumentationFilter filter,
193+
String[] instrClassNames, String[] instrMethodNames, String[] instrMethodSigs, int nInstrMethods)
194+
throws NoDataAvailableException {
182195
super(beginTime, timeTaken);
183196

184197
this.collectingTwoTimeStamps = collectingTwoTimestamps;
198+
this.filter = filter;
185199

186200
this.instrMethodClassesViews = new String[3][];
187201
this.instrMethodClassesViews[METHOD_LEVEL_VIEW] = instrClassNames;
@@ -216,6 +230,13 @@ public CPUResultsSnapshot(long beginTime, long timeTaken, CPUCCTProvider cctProv
216230

217231
//~ Methods ------------------------------------------------------------------------------------------------------------------
218232

233+
@Override
234+
public void setProfilerSettings(ProfilerEngineSettings pes) {
235+
if (pes.getCPUProfilingType() == CommonConstants.CPU_SAMPLED) {
236+
filter = pes.getInstrumentationFilter();
237+
}
238+
}
239+
219240
public boolean isCollectingTwoTimeStamps() {
220241
return collectingTwoTimeStamps;
221242
}

visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/FlatProfileContainer.java

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
package org.graalvm.visualvm.lib.jfluid.results.cpu;
4545

4646
import org.graalvm.visualvm.lib.jfluid.client.ClientUtils;
47+
import org.graalvm.visualvm.lib.jfluid.filters.InstrumentationFilter;
4748
import org.graalvm.visualvm.lib.jfluid.global.CommonConstants;
4849
import org.graalvm.visualvm.lib.jfluid.utils.IntSorter;
4950
import org.graalvm.visualvm.lib.jfluid.utils.LongSorter;
@@ -189,6 +190,41 @@ public void filterOriginalData(String[] filters, int type, double valueFilter) {
189190
// }
190191
}
191192

193+
public void filterOriginalData(InstrumentationFilter filter) {
194+
if (filter == null || filter.isEmpty()) {
195+
nRows = totalMethods; // Effectively removes all filtering
196+
197+
return;
198+
}
199+
// Now go through all methods and move those that don't pass filter to the end of the array
200+
nRows = totalMethods;
201+
202+
for (int i = 0; i < nRows; i++) {
203+
if (!filter.passes(getMethodNameAtRow(i).replace('.', '/'))) {
204+
int endIdx = --nRows;
205+
206+
if (i >= endIdx) {
207+
continue;
208+
}
209+
210+
// Swap the current element and the one at (nRows - 1) index
211+
swap(i, endIdx);
212+
213+
swap(methodIds,i,endIdx);
214+
swap(timeInMcs0,i,endIdx);
215+
swap(totalTimeInMcs0,i,endIdx);
216+
217+
if (collectingTwoTimeStamps) {
218+
swap(timeInMcs1,i,endIdx);
219+
swap(totalTimeInMcs1,i,endIdx);
220+
}
221+
222+
swap(nInvocations,i,endIdx);
223+
i--; // Because we've just put an unchecked element at the current position
224+
}
225+
}
226+
}
227+
192228
public void sortBy(int sortCrit, boolean order) {
193229
// switch (sortCrit) {
194230
// case SORT_BY_NAME:
@@ -559,17 +595,17 @@ private boolean passedFilter(String value, String filter, int type) {
559595
// arr[i2] = itmp;
560596
// }
561597
//
562-
// private static void swap(long[] arr, int i1, int i2) {
563-
// long itmp = arr[i1];
564-
// arr[i1] = arr[i2];
565-
// arr[i2] = itmp;
566-
// }
567-
//
568-
// private static void swap(int[] arr, int i1, int i2) {
569-
// int itmp = arr[i1];
570-
// arr[i1] = arr[i2];
571-
// arr[i2] = itmp;
572-
// }
598+
private static void swap(long[] arr, int i1, int i2) {
599+
long itmp = arr[i1];
600+
arr[i1] = arr[i2];
601+
arr[i2] = itmp;
602+
}
603+
604+
private static void swap(int[] arr, int i1, int i2) {
605+
int itmp = arr[i1];
606+
arr[i1] = arr[i2];
607+
arr[i2] = itmp;
608+
}
573609

574610
protected void swap(int a, int b) {}
575611

visualvm/libs.profiler/lib.profiler/src/org/graalvm/visualvm/lib/jfluid/results/cpu/StackTraceSnapshotBuilder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,9 @@ public final CPUResultsSnapshot createSnapshot(
679679
instrMethodSigs[counter] = mi.signature;
680680
counter++;
681681
}
682-
return new CPUResultsSnapshot(since, System.currentTimeMillis(), ccgb, ccgb.isCollectingTwoTimeStamps(), instrMethodClasses, instrMethodNames, instrMethodSigs, miCount);
682+
return new CPUResultsSnapshot(since, System.currentTimeMillis(),
683+
ccgb, ccgb.isCollectingTwoTimeStamps(), filter,
684+
instrMethodClasses, instrMethodNames, instrMethodSigs, miCount);
683685
}
684686
}
685687

visualvm/libs.profiler/profiler/nbproject/project.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ made subject to such option by the copyright holder.
7474
<compile-dependency/>
7575
<run-dependency>
7676
<release-version>2</release-version>
77-
<specification-version>2.1</specification-version>
77+
<specification-version>2.2</specification-version>
7878
</run-dependency>
7979
</dependency>
8080
<dependency>

visualvm/libs.profiler/profiler/src/org/graalvm/visualvm/lib/profiler/LoadedSnapshot.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import javax.management.openmbean.CompositeData;
6666
import javax.swing.SwingUtilities;
6767
import org.graalvm.visualvm.lib.common.ProfilingSettingsPresets;
68+
import org.graalvm.visualvm.lib.jfluid.ProfilerEngineSettings;
6869
import org.graalvm.visualvm.lib.jfluid.results.cpu.StackTraceSnapshotBuilder;
6970
import org.graalvm.visualvm.lib.jfluid.results.jdbc.JdbcResultsSnapshot;
7071
import org.graalvm.visualvm.lib.jfluid.results.memory.SampledMemoryResultsSnapshot;
@@ -502,6 +503,9 @@ private boolean load(DataInputStream dis) throws IOException {
502503

503504
return false;
504505
}
506+
ProfilerEngineSettings pes = new ProfilerEngineSettings();
507+
settings.applySettings(pes);
508+
snapshot.setProfilerSettings(pes);
505509

506510
return true;
507511
}

0 commit comments

Comments
 (0)