You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by bu...@apache.org on 2005/05/24 09:30:38 UTC
DO NOT REPLY [Bug 35037] New: -
Some Field methods use Classcast check instead of instanceof which is slow
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG�
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=35037>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND�
INSERTED IN THE BUG DATABASE.
http://issues.apache.org/bugzilla/show_bug.cgi?id=35037
Summary: Some Field methods use Classcast check instead of
instanceof which is slow
Product: Lucene
Version: CVS Nightly - Specify date in submission
Platform: Other
OS/Version: other
Status: NEW
Severity: normal
Priority: P2
Component: Index
AssignedTo: lucene-dev@jakarta.apache.org
ReportedBy: psmith@apache.org
I am not sure if this is because Lucene historically needed to work with older
JVM's but with modern JVM's, instanceof is much quicker.
The Field.stringValue(), .readerValue(), and .binaryValue() methods all use
ClassCastException checking.
Using the following test-bed class, you will see that instanceof is miles quicker:
package com.aconex.index;
public class ClassCastExceptionTest {
private static final long ITERATIONS = 100000;
/**
* @param args
*/
public static void main(String[] args) {
runClassCastTest(1); // once for warm up
runClassCastTest(2);
runInstanceOfCheck(1);
runInstanceOfCheck(2);
}
private static void runInstanceOfCheck(int run) {
long start = System.currentTimeMillis();
Object foo = new Foo();
for (int i = 0; i < ITERATIONS; i++) {
String test;
if(foo instanceof String) {
System.out.println("Is a string"); // should never print
}
}
long end = System.currentTimeMillis();
long diff = end - start;
System.out.println("InstanceOf checking run #" + run + ": " + diff + "ms");
}
private static void runClassCastTest(int run) {
long start = System.currentTimeMillis();
Object foo = new Foo();
for (int i = 0; i < ITERATIONS; i++) {
String test;
try {
test = (String)foo;
} catch (ClassCastException c) {
// ignore
}
}
long end = System.currentTimeMillis();
long diff = end - start;
System.out.println("ClassCast checking run #" + run + ": " + diff + "ms");
}
private static final class Foo {
}
}
Results
=======
Run #1
ClassCast checking run #1: 1660ms
ClassCast checking run #2: 1374ms
InstanceOf checking run #1: 8ms
InstanceOf checking run #2: 4ms
Run #2
ClassCast checking run #1: 1280ms
ClassCast checking run #2: 1344ms
InstanceOf checking run #1: 7ms
InstanceOf checking run #2: 2ms
Run #3
ClassCast checking run #1: 1347ms
ClassCast checking run #2: 1250ms
InstanceOf checking run #1: 7ms
InstanceOf checking run #2: 2ms
This could explain why Documents with more Fields scales worse, as in, for lots
of Documents with lots of Fields, the effect is exacerbated.
--
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org