1 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 ; 29 import java.io.IOException ; 30 import java.util.ArrayList ; 31 import java.util.Collection ; 32 import java.util.HashSet ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 import java.util.Set ; 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 environments = new HashSet (); 48 private ObjectInstanceMonitor imo; 49 50 public void setUp() throws Exception { 51 52 paranoid = false; 53 imo = new ObjectInstanceMonitorImpl(); 54 55 57 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 customSerializerEnvironment = newEnvironment(); 69 70 CustomSerializationAdapterFactory customSaf = new CustomSerializationAdapterFactory(); 71 customSerializerPersistor = new SleepycatPersistor(new NullTCLogger(), customSerializerEnvironment, customSaf); 72 } 73 74 public void tearDown() throws Exception { 75 for (Iterator i = environments.iterator(); i.hasNext();) { 76 ((DBEnvironment) i.next()).close(); 77 } 78 } 79 80 public void testStoreAndLoad() throws Exception { 81 ManagedObjectImpl customSerializerMo = newManagedObject(); 82 ManagedObjectImpl sleepycatSerializerMo = newManagedObject(); 83 84 int iterations = 100; 85 int cycles = 5; 86 87 List sleepycatStoreStats = new ArrayList (cycles); 88 List sleepycatLoadStats = new ArrayList (cycles); 89 List tcStoreStats = new ArrayList (cycles); 90 List tcLoadStats = new ArrayList (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 { 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 sleepycatSstats = new ArrayList (cycles); 146 List sleepycatDsstats = new ArrayList (cycles); 147 List tcSstats = new ArrayList (cycles); 148 List tcDsstats = new ArrayList (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 , ClassNotFoundException { 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 (true)); 222 cursor.addPhysicalAction("byteField" + i, new Byte ((byte) 1)); 223 cursor.addPhysicalAction("characterField" + i, new Character ('c')); 224 cursor.addPhysicalAction("doubleField" + i, new Double (100.001d)); 225 cursor.addPhysicalAction("floatField" + i, new Float (100.001f)); 226 cursor.addPhysicalAction("intField" + i, new Integer (100)); 227 cursor.addPhysicalAction("longField" + i, new Long (100)); 228 cursor.addPhysicalAction("shortField" + i, new Short ((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 { 236 File envHome; 237 int counter = 0; 238 do { 239 envHome = new File (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 stats) { 250 Summary avg = new Summary(); 251 Stats stat = null; 252 for (Iterator 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 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 toString() { 276 return "time: " + time; 277 } 278 } 279 } 280 | Popular Tags |