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
.ctf
.core
.tests
.shared
.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
.TmfEventRequest
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.request
.ITmfEventRequest
.ExecutionType
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
32 import org
.eclipse
.tracecompass
.tmf
.ctf
.core
.CtfTmfTrace
;
33 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.trace
.TmfExperimentStub
;
34 import org
.junit
.Test
;
37 * Coalescing benchmark
39 * @author Matthew Khouzam
41 public class ExperimentBenchmark
{
43 private static final String TEST_ID
= "org.eclipse.linuxtools#Experiment benchmark#";
44 private static final int MAX_TRACES
= 160;
45 private static final int BLOCK_SIZE
= 100;
46 private static final String TRACES_ROOT_PATH
= CtfTestTrace
.TRACE_EXPERIMENT
.getPath();
47 private static final int SAMPLE_SIZE_SLOW
= 20;
48 private static final int SAMPLE_SIZE
= 100;
50 private TmfExperimentStub fExperiment
;
56 public void benchmarkExperimentSizeRequest() {
57 Performance perf
= Performance
.getDefault();
59 for (int numTraces
= 1; numTraces
< MAX_TRACES
; numTraces
= (int) (1.6 * (numTraces
+ 1))) {
60 PerformanceMeter pm
= perf
.createPerformanceMeter(TEST_ID
+ numTraces
+ " traces");
61 perf
.tagAsSummary(pm
, "Experiment Benchmark:" + numTraces
+ " traces", Dimension
.CPU_TIME
);
62 if ((int) (1.6 * (numTraces
+ 1)) > MAX_TRACES
) {
63 perf
.tagAsGlobalSummary(pm
, "Experiment Benchmark:" + numTraces
+ " traces", Dimension
.CPU_TIME
);
66 int sampleSize
= SAMPLE_SIZE
;
68 sampleSize
= SAMPLE_SIZE_SLOW
;
71 for (int s
= 0; s
< sampleSize
; s
++) {
73 InnerEventRequest expReq
= new InnerEventRequest(ITmfEvent
.class, 0, ITmfEventRequest
.ALL_DATA
, ExecutionType
.BACKGROUND
);
74 InnerEventRequest traceReq
[] = new InnerEventRequest
[numTraces
];
77 fExperiment
.sendRequest(expReq
);
78 ITmfTrace
[] traces
= fExperiment
.getTraces();
79 for (int i
= 0; i
< numTraces
; i
++) {
80 traceReq
[i
] = new InnerEventRequest(ITmfEvent
.class, 0, ITmfEventRequest
.ALL_DATA
, ExecutionType
.BACKGROUND
);
81 traces
[i
].sendRequest(traceReq
[i
]);
85 waitForRequest(expReq
, traceReq
);
88 for (int i
= 0; i
< traces
.length
; i
++) {
89 if (!expReq
.isTraceHandled(traces
[i
])) {
90 System
.err
.println("Trace " + i
+ " not handled!");
94 fExperiment
.dispose();
104 * maximum number of traces to open
106 private void init(int maxTraces
) {
108 File parentDir
= new File(TRACES_ROOT_PATH
);
109 File
[] traceFiles
= parentDir
.listFiles();
110 ITmfTrace
[] traces
= new CtfTmfTrace
[Math
.min(maxTraces
, traceFiles
.length
)];
111 for (int i
= 0; i
< traces
.length
; i
++) {
112 traces
[i
] = new CtfTmfTrace();
114 fExperiment
= new TmfExperimentStub("MegaExperiment", traces
, BLOCK_SIZE
);
116 for (int i
= 0; i
< (traces
.length
) && (j
< traces
.length
); i
++) {
117 String absolutePath
= traceFiles
[j
].getAbsolutePath();
118 if (traces
[i
].validate(null, absolutePath
).isOK()) {
119 traces
[i
].initTrace(null, absolutePath
, ITmfEvent
.class);
125 if (traces
[traces
.length
- 1].getPath() == null) {
126 throw new TmfTraceException("Insufficient valid traces in directory");
128 } catch (TmfTraceException e
) {
129 System
.out
.println(e
.getMessage());
133 private static void waitForRequest(InnerEventRequest expReq
, InnerEventRequest
[] traceReqs
) {
135 expReq
.waitForCompletion();
136 List
<InnerEventRequest
> reqs
= Arrays
.asList(traceReqs
);
137 for (InnerEventRequest traceReq
: reqs
) {
138 traceReq
.waitForCompletion();
140 } catch (InterruptedException e
) {
144 private static class InnerEventRequest
extends TmfEventRequest
{
145 private Set
<String
> fTraces
= new HashSet
<>();
147 public InnerEventRequest(Class
<?
extends ITmfEvent
> dataType
, long index
, int nbRequested
, ExecutionType priority
) {
148 super(dataType
, index
, nbRequested
, priority
);
152 public void handleData(ITmfEvent event
) {
153 super.handleData(event
);
154 if (!fTraces
.contains(event
.getTrace().getName())) {
155 fTraces
.add(event
.getTrace().getName());
159 public boolean isTraceHandled(ITmfTrace trace
) {
160 return fTraces
.contains(trace
.getName());