The problems with StringBuilders...
Bryce McKinlay
mckinlay@redhat.com
Wed Oct 5 17:50:00 GMT 2005
David Daney wrote:
>> Right, and the JET paper suggests that they know a lot about how all
>> the system classes behave. That might be the key to most of the
>> performance improvement -- you're not alowed to replace system
>> classes, and many of them are final, so...
>
>
> ... Any call to any method in java.* could be inlined or converted
> into a call to an equivalent but more effecient implementation.
> Further more, code analysis can be done to see if it is safe to use
> vastly simpler implementations.
You can only do this if you make some closed-world assumptions.
Certainly for things like Math.*, the methods are simple enough and
well-defined enough that they can be trivially inlined - and we already
do this. But for the general case, its not possible to inline java.*
methods without breaking binary compatibility rules, and thus
disallowing the code from running on a newer version of the runtime.
JET can probably do better here because it builds the JRE into the
application binary rather than separating the application from the
runtime as we do. If you assume a static, unchangeable runtime, then you
can do much more with optimization - but you also get much larger
binaries, and lose a great deal of flexibility.
Even if you know the implementation won't change, java.nio.*Buffer is
still tricky case (again, assuming a non-closed world) because it is
abstract. Unless you know exactly how the Buffer was allocated, you
can't guarantee that the Buffer passed to a given method will actually
be the runtime's implementation. We'd have to implement Buffer.get()
something like the following:
if (bufobj instanceof GCJByteBufferImpl)
{ .. inlined get() implementation... }
else
call bufobj.get()
In a simple implementation, the bloat would probably eliminate much of
the benefit from avoiding the call. However, where buffer calls occur in
a loop, and bufobj is invariant, this could be improved by compiling two
separate copies of the loop and doing the instanceof just once to select
which one to execute.
Bryce
More information about the Java
mailing list