1   package ch.qos.logback.access.net;
2   
3   import java.io.IOException;
4   import java.io.ObjectOutputStream;
5   
6   import junit.framework.TestCase;
7   import ch.qos.logback.access.dummy.DummyAccessEventBuilder;
8   import ch.qos.logback.access.spi.AccessEvent;
9   
10  public class SerializationPerfTest extends TestCase {
11  
12    ObjectOutputStream oos;
13    
14    int loopNumber = 10000;
15    int resetFrequency = 100;
16    int pauseFrequency = 10;
17    long pauseLengthInMillis = 20;
18    
19  
20    public void setUp() throws Exception {
21      super.setUp();
22      oos = new ObjectOutputStream(new NOPOutputStream());
23  
24    }
25  
26    public void tearDown() throws Exception {
27      super.tearDown();
28      oos.close();
29      oos = null;
30    }
31    
32    public void test1() throws Exception {
33      // first run for just in time compiler
34      int resetCounter = 0;
35      int pauseCounter = 0;
36      for (int i = 0; i < loopNumber; i++) {
37        try {
38          AccessEvent ae = DummyAccessEventBuilder.buildNewAccessEvent();
39          //average time for the next method: 5000 nanos
40          ae.prepareForDeferredProcessing();
41          oos.writeObject(ae);
42          oos.flush();
43          if (++resetCounter >= resetFrequency) {
44            oos.reset();
45            resetCounter = 0;
46          }
47          if (++pauseCounter >= pauseFrequency) {
48            Thread.sleep(pauseLengthInMillis);
49            pauseCounter = 0;
50          }
51  
52        } catch (IOException ex) {
53          fail(ex.getMessage());
54        }
55      }
56      
57      // second run
58      Long t1;
59      Long t2;
60      Long total = 0L;
61      resetCounter = 0;
62      pauseCounter = 0;
63      // System.out.println("Beginning mesured run");
64      for (int i = 0; i < loopNumber; i++) {
65        try {
66          AccessEvent ae = DummyAccessEventBuilder.buildNewAccessEvent();
67          t1 = System.nanoTime();
68          //average length of the next method: 4000 nanos
69          ae.prepareForDeferredProcessing();
70          oos.writeObject(ae);
71          oos.flush();
72          t2 = System.nanoTime();
73          total += (t2 - t1);
74          if (++resetCounter >= resetFrequency) {
75            oos.reset();
76            resetCounter = 0;
77          }
78          if (++pauseCounter >= pauseFrequency) {
79            Thread.sleep(pauseLengthInMillis);
80            pauseCounter = 0;
81          }
82        } catch (IOException ex) {
83          fail(ex.getMessage());
84        }
85      }
86      
87      total /= (1000);//nanos -> micros
88      System.out.println("Loop done : average time = " + total / loopNumber
89          + " microsecs after " + loopNumber + " writes.");
90      //average time: 26-30 microsec = 0.030 millis
91    }
92    
93    
94  
95  }