views:

87

answers:

4

I created a filter that monitors the length of a request.

long start = System.nanoTime();

...

long end = System.nanoTime();

How can I get the number of milliseconds from this now?

A: 

Just subtract them and divide result by 10^6.

1 nanosecond is 10^-9 seconds and, correspondingly, 10^-6 milliseconds.
http://en.wikipedia.org/wiki/Nano-

Nikita Rybak
+4  A: 
(end - start) / 1000000

1 microsecond = 1000 nanoseconds

1 millisecond = 1000 microseconds

Note, that the result will be rounded down, but you usually don't get true nanosecond accuracy anyway (accuracy depends on the OS). From the Javadoc on nanoTime():

This method provides nanosecond precision, but not necessarily nanosecond accuracy.

Chris Lercher
And just in case... Precision roughly means the number of decimals (the number 1.00000000000135738 has a lot of precision) whereas accuracy says something about how many of those decimals are right. For example 1.0001 with an accuracy of 0.01 could be anywhere between 1.0101 and 0.9901, whereas 1.0 with an accuracy of 0.000001 is guaranteed to be somewhere between 0.000009 and 1.000001
Michael Clerx
that works, but the number it returns is like 10, or 5 instead of 10.234234234 or something. do I have to cast?
Blankman
@Blankman: If you want to get a number like 10.234234234, you can use `(end - start) / (double) 1000000` (or `(end - start) / 1000000.`, or `(end - start) / (float) 1000000` if you want float)
Chris Lercher
+1  A: 

You could just use System.currentTimeMillis().

Caveat:

Note that while the unit of time of the return value is a millisecond, the granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds.

harto
A: 

To get a meaningful result:

void procedure ( ... )
{
     ...
}

double measureProcedure ( double epsilon , ... )
{
    double mean ;
    double stderr = 2 * epsilon ;
    while ( stderr > epsilon )
    {
         long start = System.nanoTime();
         procedure ( ... ) ;
         long end = System.nanoTime();
         // recalculate mean , stderr 
    }
    return ( mean / 1000000 ) ;
}
emory