Patricia Shanahan wrote:
> Lew wrote:
>> Joshua Cranmer wrote:
>>> wrote:
>>>> String value="";
>>>> if(value.length() == 0) {
>>>> char data[]=new char[count];
>>>> for(int c=0;c<count;c++){
>>>> data[c]='0';
>>>> }
>>>> value=new String(data);
>>>
>>> Why do you want to optimize this code? Have you profiled to make sure
>>> that it is these lines specifically that are the bottleneck?
>>>
>>> If speed really is an issue, then the only thing that jumps out at me
>>> for optimizing is getting rid of the for loop:
>>>
>>> java.util.Arrays.fill(data, '0');
>>
>> Is that faster? Enough faster?
>>
>
> It may be faster, depending on the system. The only way to tell if it is
> enough faster is for the OP to measure it.
>
> Many systems have a very fast way of pushing a repeated bit pattern to
> an area of memory. For example, on Sun SPARC systems, 64 byte chunks of
> memory can be written from the floating point registers.
>
> If the OP's system has some such facility, and Arrays.fill is
> implemented on that system as a native method using an optimized memory
> write method, then it may be significantly faster than than writing one
> char at a time.
You right. However, the reference implementation of Arrays.fill() (I
mean the one from the Sun) is implemented as a simple loop filling an
array slot by slot.
A few years ago I wrote an alternative version of the array fill based
on System.arraycopy(), which without an extra optimizations normally
performed by the server JVM is even 5 times faster (sometimes more) than
the original Arrays.fill() implementation. (The server JVM usually
still executes it faster, but it's not as significant as in a case of
the client JVM -- typically not faster than 2 times.)
The original algorithm is there:
<http://groups.google.com/group/pl.comp.lang.java/msg/99526c39faf0338c?>
The thread includes also a performance test driver, and some test
results. (Sorry, the thread is in Polish. But at least the code should
be clear for everyone, I hope...)
piotr