A member at CodeRanch asked a question that prompted me to write a qucik program to determine which of two String operations were faster. This is the first time my instinct was to use Java 8 functionality to do it.
The interesting features:
- Uses Instant and Duration instead of System.currentTimeMillis().
- Uses functional programming to pass the expression to run to the timer rather than duplicating the timer logic or using a subclass
- Uses underscores to make # iterations more readable. (Ok, this is Java 7 not Java 8)
public class PlayTest { public static void main(String[] args) throws Exception { timer("string concatenation", () -> "/root/" + getFolderName() + "/subfolder"); timer("string format", () -> String.format("/root/%s/subfolder", getFolderName())); } private static void timer(String message, Supplier<String> candidate) { Instant start = Instant.now(); int times = 1_000_000; for (int i = 0; i < times; i++) { candidate.get(); } Instant end = Instant.now(); System.out.println(message + " : " + Duration.between(start, end)); } private static String getFolderName() { return "foo"; } }
The old way (for comparison)
public static void oldWay() { long before = System.currentTimeMillis(); int times = 1_000_000; for (int i = 0; i < times; i++) { String s = "/root/" + getFolderName() + "/subfolder"; } long after = System.currentTimeMillis(); System.out.println("String concatenation: " + (after - before)); }
The output
The output is also clearer.
string concatenation : PT0.5533S
Vs
string concatenation : 553
I actually get units of time without doing anything special now. And in case you are wondering, the conclusion is that string concatenation is faster. I expected that. It was way faster than I expected though. Twenty times faster.