e4fbe643491accc8063e2c27cbc180364ef4ee23
[deliverable/tracecompass.git] / ctf / org.eclipse.tracecompass.tmf.ctf.core.tests / perf / org / eclipse / tracecompass / tmf / ctf / core / tests / perf / experiment / ExperimentBenchmark.java
1 /*******************************************************************************
2 * Copyright (c) 2014 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Matthew Khouzam - Initial API and implementation
11 * Geneviève Bastien - Convert to JUnit performance test
12 *******************************************************************************/
13
14 package org.eclipse.tracecompass.tmf.ctf.core.tests.perf.experiment;
15
16 import java.io.File;
17 import java.util.Arrays;
18 import java.util.HashSet;
19 import java.util.List;
20 import java.util.Set;
21
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;
36
37 /**
38 * Coalescing benchmark
39 *
40 * @author Matthew Khouzam
41 */
42 public class ExperimentBenchmark {
43
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;
50
51 private TmfExperimentStub fExperiment;
52
53 /**
54 * Run the benchmark
55 */
56 @Test
57 public void benchmarkExperimentSizeRequest() {
58 Performance perf = Performance.getDefault();
59
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);
65 }
66
67 int sampleSize = SAMPLE_SIZE;
68 if (numTraces > 20) {
69 sampleSize = SAMPLE_SIZE_SLOW;
70 }
71
72 for (int s = 0; s < sampleSize; s++) {
73
74 InnerEventRequest expReq = new InnerEventRequest(ITmfEvent.class, 0, ITmfEventRequest.ALL_DATA, ExecutionType.BACKGROUND);
75 InnerEventRequest traceReq[] = new InnerEventRequest[numTraces];
76
77 init(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]);
83 }
84
85 pm.start();
86 waitForRequest(expReq, traceReq);
87 pm.stop();
88
89 for (int i = 0; i < traces.size(); i++) {
90 if (!expReq.isTraceHandled(traces.get(i))) {
91 System.err.println("Trace " + i + " not handled!");
92 }
93 }
94
95 fExperiment.dispose();
96 }
97 pm.commit();
98 }
99 }
100
101 /**
102 * Initialization
103 *
104 * @param maxTraces
105 * maximum number of traces to open
106 */
107 private void init(int maxTraces) {
108 try {
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();
114 }
115 fExperiment = new TmfExperimentStub("MegaExperiment", traces, BLOCK_SIZE);
116 int j = 0;
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);
121 } else {
122 i--;
123 }
124 j++;
125 }
126 if (traces[traces.length - 1].getPath() == null) {
127 throw new TmfTraceException("Insufficient valid traces in directory");
128 }
129 } catch (TmfTraceException e) {
130 System.out.println(e.getMessage());
131 }
132 }
133
134 private static void waitForRequest(InnerEventRequest expReq, InnerEventRequest[] traceReqs) {
135 try {
136 expReq.waitForCompletion();
137 List<InnerEventRequest> reqs = Arrays.asList(traceReqs);
138 for (InnerEventRequest traceReq : reqs) {
139 traceReq.waitForCompletion();
140 }
141 } catch (InterruptedException e) {
142 }
143 }
144
145 private static class InnerEventRequest extends TmfEventRequest {
146 private Set<String> fTraces = new HashSet<>();
147
148 public InnerEventRequest(Class<? extends ITmfEvent> dataType, long index, int nbRequested, ExecutionType priority) {
149 super(dataType, index, nbRequested, priority);
150 }
151
152 @Override
153 public void handleData(ITmfEvent event) {
154 super.handleData(event);
155 if (!fTraces.contains(event.getTrace().getName())) {
156 fTraces.add(event.getTrace().getName());
157 }
158 }
159
160 public boolean isTraceHandled(ITmfTrace trace) {
161 return fTraces.contains(trace.getName());
162 }
163 }
164 }
This page took 0.063599 seconds and 4 git commands to generate.