1 /*******************************************************************************
2 * Copyright (c) 2014 Ericsson
4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Matthew Khouzam - Initial API and implementation
11 * Geneviève Bastien - Convert to JUnit performance test
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.ctf
.core
.tests
.perf
.experiment
;
17 import java
.util
.Arrays
;
18 import java
.util
.HashSet
;
19 import java
.util
.List
;
22 import org
.eclipse
.test
.performance
.Dimension
;
23 import org
.eclipse
.test
.performance
.Performance
;
24 import org
.eclipse
.test
.performance
.PerformanceMeter
;
25 import org
.eclipse
.tracecompass
.testtraces
.ctf
.CtfTestTrace
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.exceptions
.TmfTraceException
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.request
.ITmfEventRequest
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.request
.ITmfEventRequest
.ExecutionType
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.request
.TmfEventRequest
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
32 import org
.eclipse
.tracecompass
.tmf
.ctf
.core
.tests
.shared
.CtfTmfTestTraceUtils
;
33 import org
.eclipse
.tracecompass
.tmf
.ctf
.core
.trace
.CtfTmfTrace
;
34 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.trace
.TmfExperimentStub
;
35 import org
.junit
.Test
;
38 * Coalescing benchmark
40 * @author Matthew Khouzam
42 public class ExperimentBenchmark
{
44 private static final String TEST_ID
= "org.eclipse.linuxtools#Experiment benchmark#";
45 private static final int MAX_TRACES
= 160;
46 private static final int BLOCK_SIZE
= 100;
47 private static final String TRACES_ROOT_PATH
= CtfTmfTestTraceUtils
.getTrace(CtfTestTrace
.TRACE_EXPERIMENT
).getPath();
48 private static final int SAMPLE_SIZE_SLOW
= 20;
49 private static final int SAMPLE_SIZE
= 100;
51 private TmfExperimentStub fExperiment
;
57 public void benchmarkExperimentSizeRequest() {
58 Performance perf
= Performance
.getDefault();
60 for (int numTraces
= 1; numTraces
< MAX_TRACES
; numTraces
= (int) (1.6 * (numTraces
+ 1))) {
61 PerformanceMeter pm
= perf
.createPerformanceMeter(TEST_ID
+ numTraces
+ " traces");
62 perf
.tagAsSummary(pm
, "Experiment Benchmark:" + numTraces
+ " traces", Dimension
.CPU_TIME
);
63 if ((int) (1.6 * (numTraces
+ 1)) > MAX_TRACES
) {
64 perf
.tagAsGlobalSummary(pm
, "Experiment Benchmark:" + numTraces
+ " traces", Dimension
.CPU_TIME
);
67 int sampleSize
= SAMPLE_SIZE
;
69 sampleSize
= SAMPLE_SIZE_SLOW
;
72 for (int s
= 0; s
< sampleSize
; s
++) {
74 InnerEventRequest expReq
= new InnerEventRequest(ITmfEvent
.class, 0, ITmfEventRequest
.ALL_DATA
, ExecutionType
.BACKGROUND
);
75 InnerEventRequest traceReq
[] = new InnerEventRequest
[numTraces
];
78 fExperiment
.sendRequest(expReq
);
79 List
<ITmfTrace
> traces
= fExperiment
.getTraces();
80 for (int i
= 0; i
< numTraces
; i
++) {
81 traceReq
[i
] = new InnerEventRequest(ITmfEvent
.class, 0, ITmfEventRequest
.ALL_DATA
, ExecutionType
.BACKGROUND
);
82 traces
.get(i
).sendRequest(traceReq
[i
]);
86 waitForRequest(expReq
, traceReq
);
89 for (int i
= 0; i
< traces
.size(); i
++) {
90 if (!expReq
.isTraceHandled(traces
.get(i
))) {
91 System
.err
.println("Trace " + i
+ " not handled!");
95 fExperiment
.dispose();
105 * maximum number of traces to open
107 private void init(int maxTraces
) {
109 File parentDir
= new File(TRACES_ROOT_PATH
);
110 File
[] traceFiles
= parentDir
.listFiles();
111 ITmfTrace
[] traces
= new CtfTmfTrace
[Math
.min(maxTraces
, traceFiles
.length
)];
112 for (int i
= 0; i
< traces
.length
; i
++) {
113 traces
[i
] = new CtfTmfTrace();
115 fExperiment
= new TmfExperimentStub("MegaExperiment", traces
, BLOCK_SIZE
);
117 for (int i
= 0; i
< (traces
.length
) && (j
< traces
.length
); i
++) {
118 String absolutePath
= traceFiles
[j
].getAbsolutePath();
119 if (traces
[i
].validate(null, absolutePath
).isOK()) {
120 traces
[i
].initTrace(null, absolutePath
, ITmfEvent
.class);
126 if (traces
[traces
.length
- 1].getPath() == null) {
127 throw new TmfTraceException("Insufficient valid traces in directory");
129 } catch (TmfTraceException e
) {
130 System
.out
.println(e
.getMessage());
134 private static void waitForRequest(InnerEventRequest expReq
, InnerEventRequest
[] traceReqs
) {
136 expReq
.waitForCompletion();
137 List
<InnerEventRequest
> reqs
= Arrays
.asList(traceReqs
);
138 for (InnerEventRequest traceReq
: reqs
) {
139 traceReq
.waitForCompletion();
141 } catch (InterruptedException e
) {
145 private static class InnerEventRequest
extends TmfEventRequest
{
146 private Set
<String
> fTraces
= new HashSet
<>();
148 public InnerEventRequest(Class
<?
extends ITmfEvent
> dataType
, long index
, int nbRequested
, ExecutionType priority
) {
149 super(dataType
, index
, nbRequested
, priority
);
153 public void handleData(ITmfEvent event
) {
154 super.handleData(event
);
155 if (!fTraces
.contains(event
.getTrace().getName())) {
156 fTraces
.add(event
.getTrace().getName());
160 public boolean isTraceHandled(ITmfTrace trace
) {
161 return fTraces
.contains(trace
.getName());