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 AutoClosableis supposed to be used (pretty sure)
- It creates a new instance of TimeCodewhich isn't good
- Variables declared within the tryblock 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.
 
     
     
    