Reputation: 19026
I hear that the System.out.println();
Java statement is costly (it consumes a lot of time)
So I try to evaluate its cost:
When I evaluate 5 statements... The cost = 1.0
So I expect the cost of 1 statement = 0.2
But actually I found The cost = 0.0
!!
double t1 = 0;
double t2 = 0;
t1 = System.currentTimeMillis();
System.out.println("aa");
System.out.println("aa");
System.out.println("aa");
System.out.println("aa");
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
// The cost = 1.0
t1 = System.currentTimeMillis();
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
// The cost = 0.0
// Expected : 1.0/5 = 0.2 -- But Actual : 0.0
Why that?
Upvotes: 7
Views: 3792
Reputation: 287
Also, the time to complete System.out.println will be different on a more or less powerful computer, and how busy that computer is performing other tasks at that particular moment.
Upvotes: 1
Reputation: 95978
System#currentTimeMillis
returns long
and not double
. Thus you're loosing .2
.
Testing 5 statements is not a good idea, specially when you almost don't feel the time it takes to perform it. I advise you to have more than 5 statements to test and then reduce the amount to something more than 1 as well.
You want to do a precise measurements time, it's better to use System#nanoTime
, since it gives time in nano seconds:
long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
Look for "nanoTime vs currentTimeMillis" and you'll get hundreds of articles.
Upvotes: 11
Reputation: 6887
When i tested your code, the output is always 0.0. Pls try your benchmark with System.nanoTime();
Or do it with more System.out.println()
double t1 = 0;
double t2 = 0;
t1 = System.currentTimeMillis();
for(int i = 0; i<1000; i++)
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
t1 = System.currentTimeMillis();
for(int i = 0; i<100; i++)
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
Output: 62.0 and 5.0
And this difference of 1.2 ms is because the loop gets faster while runtime.
Upvotes: 3
Reputation: 2122
If the execution time is less than one millisecond, you will see nothing, because the clock hasn't 'ticked' yet. For this type of micro benchmarking, you should use something like:
long t1 = System.nanoTime()
for your time measurements. (this measures time in nanosecond units, although not always with that much granularity)
Upvotes: 3