Re: [Ikvm-developers] Serialization performance issues
Brought to you by:
jfrijters
From: Jeroen F. <je...@su...> - 2009-06-18 09:09:11
|
The biggest perf hit in (de)serialization is in stack walking. I've partially addressed this in 0.38 by adding "CallerID" (a mechanism to automatically pass a cookie that identifies the caller). This removes the need for calling setAccessible() on 0.38 and later. On deserialization there is also a stack walk in resolveClass() to find the first user class loader on the stack, which is the class loader that is used to try to load the class. This is very expensive. By implementing resolveClass yourself you can avoid this stack walk: protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { final Class resolvedClass = Class.forName(desc.getName(), false, classLoader); onNewClass(resolvedClass); return resolvedClass; } Finally, deserialization also requires instantiating objects without running a constructor using the relatively slow .NET API FormatterServices.GetUninitializedObject(), but there is no easy way to improve this. Regards, Jeroen > -----Original Message----- > From: Dmitriy Matveev [mailto:ma...@pa...] > Sent: Thursday, June 18, 2009 10:38 > To: ikv...@li... > Subject: [Ikvm-developers] Serialization performance issues > > Hello, IKVM developers! > > I am using IKVM of version 0.36.0.11 and I have problems with > performance of deserialization. I've noticed that in many cases you are > suggesting add calls to setAccessible(true) to optimize reflection > performance, so I tried to follow that suggestion. I tried to add > following code to my ObjectInputStream subclass: > > protected Class resolveClass(ObjectStreamClass desc) throws > IOException, > ClassNotFoundException { > final Class resolvedClass = super.resolveClass(desc); > onNewClass(resolvedClass); > return resolvedClass; > } > > private static void onNewClass(Class newClass) > { > if (visitedClasses.add(newClass)) { > > AccessibleObject.setAccessible(newClass.getDeclaredFields(), > true); > } > } > > private static final Set visitedClasses = new HashSet(); > > And that reduced time spent in deserialization by a factor of three. I > also though that calling > AccessibleObject.setAccessible(newClass.getDeclaredMethods(), true) > will also increase performance (reduce time for calls of readObject and > readResolve methods), but that was useless. Deserialization is still > very slow now (compared to java's). Is there anything I can do with > this to increase performance? > > Thank you. > > ----------------------------------------------------------------------- > ------- > Crystal Reports - New Free Runtime and 30 Day Trial Check out the new > simplified licensing option that enables unlimited royalty-free > distribution of the report engine for externally facing server and web > deployment. > http://p.sf.net/sfu/businessobjects > _______________________________________________ > Ikvm-developers mailing list > Ikv...@li... > https://lists.sourceforge.net/lists/listinfo/ikvm-developers |