It can be handy to time code execution so you know how long things take. However, I find the common way this is done sloppy since it's supposed to have the same indentation, which makes it harder to read what's actually being timed.
long start = System.nanoTime();
// The code you want to time
long end = System.nanoTime();
System.out.printf("That took: %d ms.%n", TimeUnit.NANOSECONDS.toMillis(end - start));
An attempt
I came up with the following, it looks way better, there are a few advantages & disadvantages:
Advantages:
- It's clear what's being timed because of the indentation
- It will automatically print how long something took after code finishes
Disadvantages:
- This is not the way
AutoClosable
is supposed to be used (pretty sure) - It creates a new instance of
TimeCode
which isn't good - Variables declared within the
try
block are not accessible outside of it
It can be used like this:
try (TimeCode t = new TimeCode()) {
// The stuff you want to time
}
The code which makes this possible is:
class TimeCode implements AutoCloseable {
private long startTime;
public TimeCode() {
this.startTime = System.nanoTime();
}
@Override
public void close() throws Exception {
long endTime = System.nanoTime();
System.out.printf("That took: %d ms%n",
TimeUnit.NANOSECONDS.toMillis(endTime - this.startTime));
}
}
The question
My question is:
- Is my method actually as bad as I think it is
- Is there a better way to time code execution in Java where you can clearly see what's being timed, or will I just have to settle for something like my first code block.
System.nanoTime()
instead ofSystem.currentTimeMillis()
(Link). – FaumannanoTime()
since it doesn't have to be that accurate perse. – Astringent