Re: [Htmlparser-developer] Java Performance question
Brought to you by:
derrickoswald
From: Somik R. <so...@ya...> - 2003-01-20 07:19:32
|
Hi Derrick, It was really nice to read your reply. I tried a more accurate test (no, I didnt include instanceof HTMLNode, as our matches are at most one level up). The results (attached graph) show that it is almost the same - there is no perceivable improvement in this case. I guess if one goes a couple of layers up, the benefits would start to show. Which brings me to the next question - knowing that we have no perceptible improvement to gain, should we recommend the use of the object-oriented way ? Regards, Somik ----- Original Message ----- From: "Derrick Oswald" <Der...@ro...> To: <htm...@li...> Sent: Saturday, January 18, 2003 6:36 AM Subject: Re: [Htmlparser-developer] Java Performance question > Somik, > > I think there are a couple of reasons. First is your instanceof test is > always immediately succeeding. The penalty for instanceof is when it has > to walk the inheritance heirarchy (usually all the way up to Object) to > determine failure, which would happen often if you were trying to > determine what to do with an unknown node type. Second, your getType() > involves a virtual method call that would normally not be done more than > once. That is, you would typically get the unknown type once and compare > it to each of the final types you are aware of, which would effectively > move line 45 of the second dissassembly below (generated by "javap -c > org.htmlparser.tests.InstanceofPerformanceTest") out of the kernel loop > and replace it with a "lload 8" probably: > > Method void doInstanceofTest(long[], int, long) > <snip> > 35 lconst_0 // for (i = 0 > 36 lstore 7 > 38 goto 57 > 41 aload_0 // this > 42 getfield #10 <Field org.htmlparser.HTMLNode node> // get > InstancofPerformanceTest 'node' member variable > 45 instanceof #21 <Class org.htmlparser.tags.HTMLTag> // node > instanceof HTMLTag > 48 ifeq 51 // { } > 51 lload 7 // i++ > 53 lconst_1 > 54 ladd > 55 lstore 7 > 57 lload 7 // i < numTimes > 59 lload_3 > 60 lcmp > 61 iflt 41 // repeat > </snip> > > > Method void doGetTypeTest(long[], int, long) > <snip> > 35 lconst_0 // for (i = 0 > 36 lstore 7 > 38 goto 59 > 41 aload_0 // this > 42 getfield #10 <Field org.htmlparser.HTMLNode node> // get > InstancofPerformanceTest 'node' member variable > 45 invokevirtual #23 <Method java.lang.String getType()> // > getType() virtual method call > 48 ldc #24 <String "NODE"> // 'retrieve' String "NODE" from > HTMLNode, but since it's final it's a local copy > 50 if_acmpne 53 // == > 53 lload 7 // i++ > 55 lconst_1 > 56 ladd > 57 lstore 7 > 59 lload 7 // i < numTimes > 61 lload_3 > 62 lcmp > 63 iflt 41 // repeat > </snip> > > A fairer test might be: > > type = node.getType(); > for (... > if (type == "BOGUS") > {} > else if (type == "FAKE") > {} > else if (type == "NODE") > {} > > vs. > > for (... > if (node instanceof HTMLFrameTag) > {} > else if (node instanceof HTMLFormTag) > {} > else if (node instanceof HTMLNode) > {} > > Derrick > > > Somik Raha wrote: > > > Hi Folks, > > I was tinkering around with instanceof and under the impression > > that it causes a performance hit, I tried replacing it with a > > polymorphic mechanism - by which HTMLNode has a method getType(), and > > so do the other basic nodes. A match is then attempted like so : > > if (node.getType()==HTMLTag.TYPE) > > > > instead of > > > > if (node instanceof HTMLTag) > > > > I have taken care that getType does not do object creation - it is a > > static object. One would expect the former to be faster. > > But in a performance test (InstanceofPerformanceTest in > > org.htmlparser.tests) - I find the opposite behaviour. > > Here's a graph showing the response of instanceof in blue and > > getType()==HTMLTag.TYPE in pink - > > http://htmlparser.sourceforge.net/design/pics/performance.gif > > > > Does anyone have explanations ? > > > > Regards, > > Somik > > > > > > ------------------------------------------------------- > This SF.NET email is sponsored by: Thawte.com - A 128-bit supercerts will > allow you to extend the highest allowed 128 bit encryption to all your > clients even if they use browsers that are limited to 40 bit encryption. > Get a guide here:http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0030en > _______________________________________________ > Htmlparser-developer mailing list > Htm...@li... > https://lists.sourceforge.net/lists/listinfo/htmlparser-developer |