KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > objectserver > managedobject > ManagedObjectSerializationPerformanceTest


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tc.objectserver.managedobject;
5
6 import com.sleepycat.bind.EntryBinding;
7 import com.sleepycat.bind.serial.SerialBinding;
8 import com.sleepycat.bind.serial.StoredClassCatalog;
9 import com.sleepycat.je.DatabaseEntry;
10 import com.tc.logging.NullTCLogger;
11 import com.tc.object.ObjectID;
12 import com.tc.object.tx.TransactionID;
13 import com.tc.objectserver.api.ObjectInstanceMonitor;
14 import com.tc.objectserver.core.api.ManagedObject;
15 import com.tc.objectserver.core.api.TestDNA;
16 import com.tc.objectserver.core.api.TestDNACursor;
17 import com.tc.objectserver.impl.ObjectInstanceMonitorImpl;
18 import com.tc.objectserver.persistence.api.ManagedObjectPersistor;
19 import com.tc.objectserver.persistence.api.PersistenceTransaction;
20 import com.tc.objectserver.persistence.sleepycat.CustomSerializationAdapterFactory;
21 import com.tc.objectserver.persistence.sleepycat.DBEnvironment;
22 import com.tc.objectserver.persistence.sleepycat.SerializationAdapter;
23 import com.tc.objectserver.persistence.sleepycat.SerializationAdapterFactory;
24 import com.tc.objectserver.persistence.sleepycat.SleepycatPersistor;
25 import com.tc.objectserver.persistence.sleepycat.SleepycatSerializationAdapterFactory;
26 import com.tc.test.TCTestCase;
27
28 import java.io.File JavaDoc;
29 import java.io.IOException JavaDoc;
30 import java.util.ArrayList JavaDoc;
31 import java.util.Collection JavaDoc;
32 import java.util.HashSet JavaDoc;
33 import java.util.Iterator JavaDoc;
34 import java.util.List JavaDoc;
35 import java.util.Set JavaDoc;
36
37 public class ManagedObjectSerializationPerformanceTest extends TCTestCase {
38
39   private StoredClassCatalog classCatalog;
40   private int fieldSetCount = 10;
41   private SleepycatPersistor sleepycatSerializerPersistor;
42   private SleepycatPersistor customSerializerPersistor;
43
44   private boolean paranoid;
45   private DBEnvironment sleepycatSerializerEnvironment;
46   private DBEnvironment customSerializerEnvironment;
47   private Set JavaDoc environments = new HashSet JavaDoc();
48   private ObjectInstanceMonitor imo;
49
50   public void setUp() throws Exception JavaDoc {
51
52     paranoid = false;
53     imo = new ObjectInstanceMonitorImpl();
54
55     // ManagedObjectChangeListenerProvider listenerProvider = new NullManagedObjectChangeListenerProvider();
56

57     // set up sleepycat serializer persistor
58
sleepycatSerializerEnvironment = newEnvironment();
59     SerializationAdapterFactory saf = new SleepycatSerializationAdapterFactory();
60     sleepycatSerializerPersistor = new SleepycatPersistor(new NullTCLogger(), sleepycatSerializerEnvironment, saf);
61     classCatalog = (StoredClassCatalog) sleepycatSerializerEnvironment.getClassCatalogWrapper().getClassCatalog();
62
63     ManagedObjectStateFactory.disableSingleton(true);
64     ManagedObjectStateFactory.createInstance(new NullManagedObjectChangeListenerProvider(),
65                                              sleepycatSerializerPersistor);
66
67     // set up custom serializer persistor
68
customSerializerEnvironment = newEnvironment();
69
70     CustomSerializationAdapterFactory customSaf = new CustomSerializationAdapterFactory();
71     customSerializerPersistor = new SleepycatPersistor(new NullTCLogger(), customSerializerEnvironment, customSaf);
72   }
73
74   public void tearDown() throws Exception JavaDoc {
75     for (Iterator JavaDoc i = environments.iterator(); i.hasNext();) {
76       ((DBEnvironment) i.next()).close();
77     }
78   }
79
80   public void testStoreAndLoad() throws Exception JavaDoc {
81     ManagedObjectImpl customSerializerMo = newManagedObject();
82     ManagedObjectImpl sleepycatSerializerMo = newManagedObject();
83
84     int iterations = 100;
85     int cycles = 5;
86
87     List JavaDoc sleepycatStoreStats = new ArrayList JavaDoc(cycles);
88     List JavaDoc sleepycatLoadStats = new ArrayList JavaDoc(cycles);
89     List JavaDoc tcStoreStats = new ArrayList JavaDoc(cycles);
90     List JavaDoc tcLoadStats = new ArrayList JavaDoc(cycles);
91     for (int i = 0; i < cycles; i++) {
92       Stats scStoreStat = new Stats(), scLoadStat = new Stats();
93       sleepycatStoreStats.add(scStoreStat);
94       sleepycatLoadStats.add(scLoadStat);
95
96       Stats tcStoreStat = new Stats(), tcLoadStat = new Stats();
97       tcStoreStats.add(tcStoreStat);
98       tcLoadStats.add(tcLoadStat);
99
100       storeAndLoad(scStoreStat, scLoadStat, iterations, sleepycatSerializerMo, sleepycatSerializerPersistor);
101       storeAndLoad(tcStoreStat, tcLoadStat, iterations, customSerializerMo, customSerializerPersistor);
102     }
103     System.err.println("===============================================================");
104     System.err.println("Paranoid: " + paranoid + ", field sets: " + fieldSetCount + ", cycles: " + cycles
105                        + ", iterations per cycle: " + iterations);
106     System.err.println("TC store : " + summary(tcStoreStats) + "; " + tcStoreStats);
107     System.err.println("Sleepycat store: " + summary(sleepycatStoreStats) + "; " + sleepycatStoreStats);
108     System.err.println("TC load : " + summary(tcLoadStats) + "; " + tcLoadStats);
109     System.err.println("Sleepycat load : " + summary(sleepycatLoadStats) + "; " + sleepycatLoadStats);
110
111   }
112
113   private void storeAndLoad(Stats storeStat, Stats loadStat, int iterations, ManagedObjectImpl mo,
114                             SleepycatPersistor persistor) {
115     ManagedObjectPersistor mop = persistor.getManagedObjectPersistor();
116     ObjectID objectID = mo.getID();
117     long now = System.currentTimeMillis();
118     PersistenceTransaction ptx = persistor.getPersistenceTransactionProvider().newTransaction();
119     for (int i = 0; i < iterations; i++) {
120       mo.setIsDirty(true);
121       mop.saveObject(ptx, mo);
122     }
123     ptx.commit();
124     storeStat.time += System.currentTimeMillis() - now;
125
126     ManagedObject test = null;
127     now = System.currentTimeMillis();
128     for (int i = 0; i < iterations; i++) {
129       test = mop.loadObjectByID(objectID);
130     }
131     loadStat.time += System.currentTimeMillis() - now;
132     assertTrue(mo.isEqual(test));
133   }
134
135   public void testSerialization() throws Exception JavaDoc {
136     ManagedObjectImpl customSerializerMo = newManagedObject();
137     ManagedObjectImpl sleepycatSerializerMo = newManagedObject();
138
139     EntryBinding binding = new SerialBinding(classCatalog, sleepycatSerializerMo.getClass());
140
141     int iterations = 100;
142     int cycles = 5;
143
144     DatabaseEntry entry = new DatabaseEntry();
145     List JavaDoc sleepycatSstats = new ArrayList JavaDoc(cycles);
146     List JavaDoc sleepycatDsstats = new ArrayList JavaDoc(cycles);
147     List JavaDoc tcSstats = new ArrayList JavaDoc(cycles);
148     List JavaDoc tcDsstats = new ArrayList JavaDoc(cycles);
149
150     for (int i = 0; i < cycles; i++) {
151       Stats ssstat = new Stats(), sdsstat = new Stats();
152       sleepycatSstats.add(ssstat);
153       sleepycatDsstats.add(sdsstat);
154
155       Stats tcsstat = new Stats(), tcdsstat = new Stats();
156       tcSstats.add(tcsstat);
157       tcDsstats.add(tcdsstat);
158
159       sleepycatSerialize(ssstat, sdsstat, iterations, sleepycatSerializerMo, binding, entry);
160       tcSerialize(tcsstat, tcdsstat, iterations, customSerializerMo);
161     }
162     System.err.println("===============================================================");
163     System.err.println("Paranoid: " + paranoid + ", field sets: " + fieldSetCount + ", cycles: " + cycles
164                        + ", serializations per cycle: " + iterations);
165     System.err.println("TC serialization stats : " + summary(tcSstats) + "; " + tcSstats);
166     System.err.println("Sleepycat serialization stats : " + summary(sleepycatSstats) + "; " + sleepycatSstats);
167
168     System.err.println("TC deserialization stats : " + summary(tcDsstats) + "; " + tcDsstats);
169     System.err.println("Sleepycat deserialization stats: " + summary(sleepycatDsstats) + "; " + sleepycatDsstats);
170   }
171
172   private ManagedObjectImpl newManagedObject() {
173     ManagedObjectImpl mo = new ManagedObjectImpl(new ObjectID(1));
174     TestDNA dna = newDNA();
175     mo.apply(dna, new TransactionID(1), new BackReferences(), imo);
176     return mo;
177   }
178
179   private void sleepycatSerialize(Stats serializeStats, Stats deserializeStats, int iterations, ManagedObjectImpl mo,
180                                   EntryBinding binding, DatabaseEntry entry) {
181     long now = System.currentTimeMillis();
182     for (int i = 0; i < iterations; i++) {
183       binding.objectToEntry(mo, entry);
184     }
185     serializeStats.time += System.currentTimeMillis() - now;
186     serializeStats.size += entry.getData().length;
187
188     ManagedObject test = null;
189     now = System.currentTimeMillis();
190     for (int i = 0; i < iterations; i++) {
191       test = (ManagedObject) binding.entryToObject(entry);
192     }
193     deserializeStats.time += System.currentTimeMillis() - now;
194     assertTrue(mo.isEqual(test));
195   }
196
197   private void tcSerialize(Stats serializeStats, Stats deserializeStats, int iterations, ManagedObjectImpl mo)
198       throws IOException JavaDoc, ClassNotFoundException JavaDoc {
199     long now = System.currentTimeMillis();
200     SerializationAdapter serializer = customSerializerPersistor.getSerializationAdapter();
201     DatabaseEntry entry = new DatabaseEntry();
202     for (int i = 0; i < iterations; i++) {
203       serializer.serializeManagedObject(entry, mo);
204     }
205     serializeStats.time += System.currentTimeMillis() - now;
206     serializeStats.size += entry.getData().length;
207
208     ManagedObject test = null;
209     now = System.currentTimeMillis();
210     for (int i = 0; i < iterations; i++) {
211       test = serializer.deserializeManagedObject(entry);
212     }
213     deserializeStats.time += System.currentTimeMillis() - now;
214     assertTrue(mo.isEqual(test));
215   }
216
217   private TestDNA newDNA() {
218     TestDNACursor cursor = new TestDNACursor();
219     for (int i = 0; i < fieldSetCount; i++) {
220       cursor.addPhysicalAction("refField" + i, new ObjectID(1));
221       cursor.addPhysicalAction("booleanField" + i, new Boolean JavaDoc(true));
222       cursor.addPhysicalAction("byteField" + i, new Byte JavaDoc((byte) 1));
223       cursor.addPhysicalAction("characterField" + i, new Character JavaDoc('c'));
224       cursor.addPhysicalAction("doubleField" + i, new Double JavaDoc(100.001d));
225       cursor.addPhysicalAction("floatField" + i, new Float JavaDoc(100.001f));
226       cursor.addPhysicalAction("intField" + i, new Integer JavaDoc(100));
227       cursor.addPhysicalAction("longField" + i, new Long JavaDoc(100));
228       cursor.addPhysicalAction("shortField" + i, new Short JavaDoc((short) 1));
229       cursor.addPhysicalAction("stringField" + i, "This is a nice string to add" + i);
230     }
231     TestDNA dna = new TestDNA(cursor);
232     return dna;
233   }
234
235   private DBEnvironment newEnvironment() throws Exception JavaDoc {
236     File JavaDoc envHome;
237     int counter = 0;
238     do {
239       envHome = new File JavaDoc(getTempDirectory(), "database-environment-home" + (++counter));
240     } while (envHome.exists());
241     envHome.mkdir();
242     assertTrue(envHome.exists());
243     assertTrue(envHome.isDirectory());
244     DBEnvironment rv = new DBEnvironment(paranoid, envHome);
245     environments.add(rv);
246     return rv;
247   }
248
249   private Summary summary(Collection JavaDoc stats) {
250     Summary avg = new Summary();
251     Stats stat = null;
252     for (Iterator JavaDoc i = stats.iterator(); i.hasNext();) {
253       stat = (Stats) i.next();
254       avg.sum += stat.time;
255     }
256     avg.average = avg.sum / stats.size();
257     avg.size = stat.size;
258     return avg;
259   }
260
261   private static final class Summary {
262     public long sum;
263     public double average;
264     public long size;
265
266     public String JavaDoc toString() {
267       return "avg: " + average + ", size: " + size;
268     }
269   }
270
271   private static final class Stats {
272     public long time;
273     public long size;
274
275     public String JavaDoc toString() {
276       return "time: " + time;
277     }
278   }
279 }
280
Popular Tags