Forums
New posts
Search forums
Members
Current visitors
Log in
Register
What's new
Search
Search
Search titles only
By:
New posts
Search forums
Menu
Log in
Register
Install the app
Install
Forums
Archive
Archive
Java
Quick way to initialize array with all zeros
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Reply to thread
Message
[QUOTE="Patricia Shanahan, post: 2827890"] Andrew Thompson wrote: .... OK, here's a new version. It does a new call, with a new array instance, for each test. I tested three approaches: trustTheJVM - Assumes that the result of "new int[size]" is already an array of zeros, as required by the JLS. fill - Use Arrays.fill. loop - Explicit loop initialization. Here are my results, times in nanoseconds: 10 trustTheJVM Mean time 2299.21 Min time 1955 Max time 5028 10 fill Mean time 4299.44 Min time 2793 Max time 149739 10 loop Mean time 2539.42 Min time 2235 Max time 4191 100 trustTheJVM Mean time 4570.47 Min time 2514 Max time 90514 100 fill Mean time 13918.03 Min time 2793 Max time 785016 100 loop Mean time 6483.99 Min time 2234 Max time 248635 1000 trustTheJVM Mean time 3363.56 Min time 2514 Max time 7543 1000 fill Mean time 39021.77 Min time 6425 Max time 2438019 1000 loop Mean time 6727.09 Min time 5588 Max time 9498 10000 trustTheJVM Mean time 25777.05 Min time 8101 Max time 769372 10000 fill Mean time 56093.72 Min time 43022 Max time 219582 10000 loop Mean time 65363.09 Min time 37993 Max time 1270553 100000 trustTheJVM Mean time 250601.74 Min time 60622 Max time 5836775 100000 fill Mean time 560487.44 Min time 529676 Max time 1038121 100000 loop Mean time 499658.44 Min time 480508 Max time 696178 1000000 trustTheJVM Mean time 1.653218217E7 Min time 14147608 Max time 20662123 1000000 fill Mean time 2.132354819E7 Min time 18011507 Max time 28056639 1000000 loop Mean time 2.159381985E7 Min time 19357209 Max time 45192057 10000000 trustTheJVM Mean time 8.072149119E7 Min time 78537636 Max time 87638792 10000000 fill Mean time 1.3643357179E8 Min time 132609870 Max time 145655943 10000000 loop Mean time 1.3610318625E8 Min time 132324919 Max time 143016501 "trustTheJVM" is the clear winner, and should be used unless there is a need to reinitialize the array after it has been modified. For small arrays, if reinitialization is needed, "loop" wins over "fill" by a reasonable margin. For large arrays, "loop" and "fill" have similar performance. I still stand by my original advice - for long arrays, if possible, depend on the original initialization implicit in "new int[size]". If that is not possible, use Arrays.fill. It is one line and has the intent specified by the method name. The only case in which I would prefer to loop is for very frequent calls to a method with a small array with performance dominated by the array initialization. The rest of this article is the source code for my tests: import java.util.Arrays; public class InitialiseToZero { public static void main(String[] args) { int[] sizes = {10,100,1000,10000,100000,1000000,10000000}; timeArrayInit[] methods = {trustTheJVM,fill,loop}; int repeatCount = 100; for(int size: sizes){ for(timeArrayInit method: methods){ method.reset(); } for(int i=0; i<repeatCount; i++){ for(timeArrayInit method: methods){ method.time(size); } } for(timeArrayInit method: methods){ System.out.println(method.getReport(size)); } } } private static timeArrayInit trustTheJVM = new timeArrayInit(){ String getName(){ return "trustTheJVM"; } int timee(int size){ int[] data = new int[size]; return data[size/2]; } }; private static timeArrayInit fill = new timeArrayInit(){ String getName(){ return "fill"; } int timee(int size){ int[] data = new int[size]; Arrays.fill(data,0); return data[size/2]; } }; private static timeArrayInit loop = new timeArrayInit(){ String getName(){ return "loop"; } int timee(int size){ int[] data = new int[size]; for(int i=0; i<size; i++){ data[i] = 0; } return data[size/2]; } }; private static abstract class timeArrayInit { abstract int timee(int size); abstract String getName(); long totalTime = 0; long minTime = Long.MAX_VALUE; long maxTime = 0; long calls = 0; void time(int size) { long start = System.nanoTime(); int result = timee(size); long end = System.nanoTime(); if (result != 0) { System.err.printf("Error in method %s result %d%n", getName(), result); } else { long time = end - start; totalTime += time; if (time < minTime) { minTime = time; } if (time > maxTime) { maxTime = time; } calls++; } } void reset(){ totalTime = 0; minTime = Long.MAX_VALUE; maxTime = 0; calls = 0; } public String getReport(int size) { StringBuilder builder = new StringBuilder(); builder.append(size); builder.append(" "+getName()); builder.append(" Mean time "+totalTime/(double)calls); builder.append(" Min time "+minTime); builder.append(" Max time "+maxTime); return builder.toString(); } } }[/i] [/QUOTE]
Verification
Post reply
Forums
Archive
Archive
Java
Quick way to initialize array with all zeros
Top