1 /*******************************************************************************
2 * Copyright (c) 2012, 2014 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made 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 * Alexandre Montplaisir - Convert to a org.eclipse.test.performance test
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.ctf
.core
.tests
.perf
.trace
;
16 import static org
.junit
.Assert
.fail
;
17 import static org
.junit
.Assume
.assumeTrue
;
19 import java
.util
.LinkedList
;
20 import java
.util
.List
;
21 import java
.util
.Random
;
23 import org
.eclipse
.test
.performance
.Dimension
;
24 import org
.eclipse
.test
.performance
.Performance
;
25 import org
.eclipse
.test
.performance
.PerformanceMeter
;
26 import org
.eclipse
.tracecompass
.ctf
.core
.event
.EventDefinition
;
27 import org
.eclipse
.tracecompass
.ctf
.core
.tests
.shared
.CtfTestTrace
;
28 import org
.eclipse
.tracecompass
.ctf
.core
.trace
.CTFReaderException
;
29 import org
.eclipse
.tracecompass
.ctf
.core
.trace
.CTFTrace
;
30 import org
.eclipse
.tracecompass
.ctf
.core
.trace
.CTFTraceReader
;
31 import org
.junit
.Test
;
34 * Tests for performance regressions of the ctf reader. It only tests the ctf
35 * reader, not tmf. <br>
36 * This test runs in 3 passes.
38 * <li>first it opens a trace</li>
39 * <li>then it reads the trace completely</li>
40 * <li>then it randomly (seeded) seeks NB_SEEKS locations in the trace and reads
41 * one event at each position.</li>
44 * @author Matthew Khouzam
45 * @author Alexandre Montplaisir
47 public class TraceSeekBenchmark
{
49 private static final Random RND
= new Random(1000);
51 private static final int LOOP_COUNT
= 25;
52 private static final int NB_SEEKS
= 500;
53 private static final String TEST_SUITE_NAME
= "CTF Read & Seek Benchmark (" + NB_SEEKS
+ " seeks)";
54 private static final String TEST_ID
= "org.eclipse.linuxtools#" + TEST_SUITE_NAME
;
57 * Run the benchmark scenario for the trace "kernel"
59 * @throws CTFReaderException
63 public void testKernelTrace() throws CTFReaderException
{
64 readAndSeekTrace(CtfTestTrace
.KERNEL
, "trace-kernel", true);
67 private static void readAndSeekTrace(CtfTestTrace testTrace
, String testName
, boolean inGlobalSummary
) throws CTFReaderException
{
68 assumeTrue(testTrace
.exists());
70 Performance perf
= Performance
.getDefault();
71 PerformanceMeter pm
= perf
.createPerformanceMeter(TEST_ID
+ '#' + testName
);
72 perf
.tagAsSummary(pm
, TEST_SUITE_NAME
+ ':' + testName
, Dimension
.CPU_TIME
);
74 if (inGlobalSummary
) {
75 perf
.tagAsGlobalSummary(pm
, TEST_SUITE_NAME
+ ':' + testName
, Dimension
.CPU_TIME
);
78 for (int loop
= 0; loop
< LOOP_COUNT
; loop
++) {
79 CTFTrace trace
= testTrace
.getTrace();
80 try (CTFTraceReader traceReader
= new CTFTraceReader(trace
);) {
82 /* Read the whole trace to find out the start and end times */
83 EventDefinition firstEvent
= traceReader
.getCurrentEventDef();
84 final long startTime
= firstEvent
.getTimestamp();
85 long endTime
= startTime
;
86 while (traceReader
.hasMoreEvents()) {
87 EventDefinition ev
= traceReader
.getCurrentEventDef();
88 endTime
= ev
.getTimestamp();
89 traceReader
.advance();
92 /* Generate the timestamps we will seek to */
93 List
<Long
> seekTimestamps
= new LinkedList
<>();
94 final long range
= endTime
- startTime
;
95 for (int i
= 0; i
< NB_SEEKS
; i
++) {
96 long delta
= (RND
.nextLong() % range
);
100 seekTimestamps
.add(startTime
+ delta
);
103 /* Benchmark seeking to the generated timestamps */
105 for (Long ts
: seekTimestamps
) {
106 traceReader
.seek(ts
);
107 traceReader
.advance();
111 } catch (CTFReaderException e
) {
112 /* Should not happen if assumeTrue() passed above */
113 fail("Test failed at iteration " + loop
+ ':' + e
.getMessage());