Skip to content

Instantly share code, notes, and snippets.

@hanohrs
Last active February 26, 2021 03:08
Show Gist options
  • Save hanohrs/24e28808cef8629ed953b926a907cb5b to your computer and use it in GitHub Desktop.
Save hanohrs/24e28808cef8629ed953b926a907cb5b to your computer and use it in GitHub Desktop.
gc timings fixed
import java.math.BigInteger;
import java.text.NumberFormat;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class SortMojis {
private static final NumberFormat NUM_FMT = NumberFormat.getNumberInstance(Locale.JAPAN);
private static final String kanjis = "\uD842\uDFB7\uD867\uDE3D";
private static final String emojis =
"\uD83D\uDC7B\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66".repeat(2);
private static final int COUNT = BigInteger.valueOf(10).pow(7).intValue();
public static final Pattern GRAPHEME_CLUSTER_BOUNDARY = Pattern.compile("\\b{g}");
private static final String[] manyEmojis = GRAPHEME_CLUSTER_BOUNDARY.split(emojis.repeat(COUNT));
public static long measureNanoTime(Runnable r) {
final long start = System.nanoTime();
r.run();
final long end = System.nanoTime();
return end - start;
}
private static String sortDesc(String str) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
StringBuilder sb = new StringBuilder(chars.length);
sb.append(chars);
return sb.reverse().toString();
}
public static void main(String[] args) {
{
System.out.println("Sorting surrogate pair Han characters (broken)");
String reversed = sortDesc(kanjis);
System.out.println(reversed);
}
{
System.out.println("Sorting surrogate pair Han characters");
String reversed = kanjis.codePoints().boxed().sorted(Comparator.reverseOrder())
.collect(
() -> new StringBuilder(),
(sb, i) -> sb.appendCodePoint(i),
(sb1, sb2) -> sb1.append(sb2)
).toString();
System.out.println(reversed);
}
{
System.out.println("Sorting emojis (broken)");
String reversed = emojis.codePoints().boxed().sorted(Comparator.reverseOrder())
.collect(
() -> new StringBuilder(),
(sb, i) -> sb.appendCodePoint(i),
(sb1, sb2) -> sb1.append(sb2)
).toString();
System.out.println(reversed);
}
{
System.out.println("Sorting emojis");
String reversed = Arrays.stream(GRAPHEME_CLUSTER_BOUNDARY.split(emojis))
.sorted(Comparator.reverseOrder())
.collect(Collectors.joining());
System.out.println(reversed);
}
{
System.out.println("parallelSort and then reverse");
String[] arr = manyEmojis.clone();
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
Arrays.parallelSort(arr);
List<String> list = Arrays.asList(arr);
Collections.reverse(list);
String reversed = String.join("", list);
System.out.println("length: " + reversed.length());
})));
}
System.gc();
{
System.out.println("parallelSort reversedOrder");
String[] arr = manyEmojis.clone();
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
Arrays.parallelSort(arr, Comparator.reverseOrder());
String reversed = String.join("", arr);
System.out.println("length: " + reversed.length());
})));
}
System.gc();
{
System.out.println("sort and then reverse");
String[] arr = manyEmojis.clone();
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
Arrays.sort(arr);
List<String> list = Arrays.asList(arr);
Collections.reverse(list);
String reversed = String.join("", list);
System.out.println("length: " + reversed.length());
})));
}
System.gc();
{
System.out.println("sort reversedOrder");
String[] arr = manyEmojis.clone();
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
Arrays.sort(arr, Comparator.reverseOrder());
String reversed = String.join("", arr);
System.out.println("length: " + reversed.length());
})));
}
System.gc();
{
System.out.println("parallel Stream reversedOrder");
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
List<String> list = Arrays.stream(manyEmojis).parallel()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
String reversed = String.join("", list);
System.out.println("length: " + reversed.length());
})));
}
System.gc();
{
System.out.println("sort the parallel Stream and then collect to a list and then reverse it");
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
List<String> list = Arrays.stream(manyEmojis).parallel()
.sorted()
.collect(Collectors.toList());
Collections.reverse(list);
String reversed = String.join("", list);
System.out.println("length: " + reversed.length());
})));
}
System.gc();
{
System.out.println("Stream reversedOrder");
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
List<String> list = Arrays.stream(manyEmojis)
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
String reversed = String.join("", list);
System.out.println("length: " + reversed.length());
})));
}
System.gc();
{
System.out.println("sort the Stream and then collect to a list and then reverse it");
System.out.println(NUM_FMT.format(measureNanoTime(() -> {
List<String> list = Arrays.stream(manyEmojis)
.sorted()
.collect(Collectors.toList());
Collections.reverse(list);
String reversed = String.join("", list);
System.out.println("length: " + reversed.length());
})));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment