1   package org.slf4j.profiler;
2   
3   
4   
5   /**
6    * 
7    * This demo illustrates usage of SLF4J profilers.
8    * 
9    * <p>
10   * We have been given the task of generating a large number, say N, 
11   * of random integers. We need to transform that array into a smaller array
12   * containing only prime numbers. The new array has to be sorted.
13   * 
14   * <p>
15   * While tackling this problem, we would like to measure the
16   * time spent in each subtask.
17   * 
18   * <p>
19   * A typical output for this demo would be:
20   <pre>
21   + Profiler [DEMO]
22  |-- elapsed time                       [RANDOM]     0.089  seconds.
23  |---+ Profiler [SORT_AND_PRUNE]
24  &nbsp;&nbsp;&nbsp;&nbsp;|-- elapsed time                         [SORT]     0.221  seconds.
25  &nbsp;&nbsp;&nbsp;&nbsp;|-- elapsed time             [PRUNE_COMPOSITES]    11.567  seconds.
26  &nbsp;&nbsp;&nbsp;&nbsp;|-- Subtotal                   [SORT_AND_PRUNE]    11.788  seconds.
27  |-- elapsed time               [SORT_AND_PRUNE]    11.788  seconds.
28  |-- Total                                [DEMO]    11.877  seconds.
29  </pre>
30   * 
31   * @author Ceki Gulcu
32   */
33  public class NestedProfilerDemo {
34    
35    public static void main(String[] args) {
36      // create a profiler called "DEMO"
37      Profiler profiler = new Profiler("DEMO");
38      
39      // register this profiler in the thread context's profiler registry
40      ProfilerRegistry profilerRegistry = ProfilerRegistry.getThreadContextInstance();
41      profiler.registerWith(profilerRegistry);
42      
43      // start a stopwatch called "RANDOM"
44      profiler.start("RANDOM");
45      RandomIntegerArrayGenerator riaGenerator = new RandomIntegerArrayGenerator();
46      int n = 10*1000;
47      int[] randomArray = riaGenerator.generate(n);
48      
49      // create and start a nested profiler called "SORT_AND_PRUNE"
50      // By virtue of its parent-child relationship with the "DEMO"
51      // profiler, and the previous registration of the parent profiler, 
52      // this nested profiler will be automatically registered
53      // with the thread context's profiler registry
54      profiler.startNested(SortAndPruneComposites.NESTED_PROFILER_NAME);
55      
56      SortAndPruneComposites pruner = new SortAndPruneComposites(randomArray);
57      pruner.sortAndPruneComposites();
58      
59      // stop and print the "DEMO" printer
60      profiler.stop().print();
61    }
62  }