Last active
August 29, 2015 14:20
-
-
Save rolfl/5c979b71c95a97578dea to your computer and use it in GitHub Desktop.
Benchmarking neatify
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Random; | |
import java.util.logging.Level; | |
import java.util.stream.LongStream; | |
import net.tuis.ubench.UBench; | |
import net.tuis.ubench.UUtils; | |
public class NeatNums { | |
private static final int GROUP_LENGTH = 3; | |
private static final char DEFAULT_DELIMITER_CHAR = ' '; | |
public static String neatify(final long number, | |
final char delimiter) { | |
final char[] charArray = Long.toString(number).toCharArray(); | |
final StringBuilder sb = new StringBuilder(); | |
int index; | |
if (charArray[0] == '-') { | |
sb.append('-'); | |
index = 1; | |
} else { | |
index = 0; | |
} | |
sb.append(charArray[index++]); | |
for (; index < charArray.length; ++index) { | |
if ((charArray.length - index) % GROUP_LENGTH == 0) { | |
sb.append(delimiter); | |
} | |
sb.append(charArray[index]); | |
} | |
return sb.toString(); | |
} | |
public static String neatify(final long number) { | |
return neatify(number, DEFAULT_DELIMITER_CHAR); | |
} | |
public static String neatifyRL(final long val) { | |
return neatifyRL(val, ' ', 3); | |
} | |
public static String neatifyRL(final long val, final char pad, final int span) { | |
if (val < 0) { | |
if (val == Long.MIN_VALUE) { | |
long minblock = (long)Math.pow(10, span); | |
// recursive hot-fix for otherwise impossible-to-make-positive value. | |
return neatifyRL(val / minblock, pad, span) + pad + neatifyRL(-(val % minblock), pad, span); | |
} | |
return "-" + neatifyRL(-val, pad, span); | |
} | |
final String raw = Long.toString(val); | |
int end = raw.length() - span * ((raw.length() - 1) / span); | |
int start = 0; | |
StringBuilder sb = new StringBuilder(raw.length() + (raw.length() / span) + 1); | |
while (start < raw.length()) { | |
sb.append(pad); | |
sb.append(raw.substring(start, end)); | |
start = end; | |
end = start + span; | |
} | |
return sb.substring(1); | |
} | |
public static void main(String[] args) { | |
Random rand = new Random(); | |
final long[] tobeneat = LongStream.generate(rand::nextLong).limit(1000).toArray(); | |
UUtils.setStandaloneLogging(Level.INFO); | |
UBench bench = new UBench("NumberPad"); | |
bench.addTask("OP", () -> LongStream.of(tobeneat).mapToObj(v -> neatify(v)).mapToInt(String::length).sum()); | |
bench.addTask("RL", () -> LongStream.of(tobeneat).mapToObj(v -> neatifyRL(v)).mapToInt(String::length).sum()); | |
bench.press(10000).report(); | |
// LongStream.generate(rand::nextLong).limit(1000).mapToObj(val -> neatify(val, ',', 4)).forEach(System.out::println); | |
// System.out.println("Test " + Long.MAX_VALUE + " -> " + neatify(Long.MAX_VALUE, ',', 4)); | |
// System.out.println("Test " + 0 + " -> " + neatify(0, ',', 4)); | |
// System.out.println("Test " + Long.MIN_VALUE + " -> " + neatify(Long.MIN_VALUE, ',', 4)); | |
// | |
// for (long v = -10; v <= 10000; v++) { | |
// String x = Long.toString(v); | |
// String g = neatify(v, ',', 4); | |
// String gns = g.replaceAll(",+", ""); | |
// if (!gns.equals(x)) { | |
// System.out.printf("Failed %d got %s not %s\n", v, g, x); | |
// } | |
// } | |
} | |
} | |
Author
rolfl
commented
May 11, 2015
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment