Last active
February 26, 2021 03:08
-
-
Save hanohrs/24e28808cef8629ed953b926a907cb5b to your computer and use it in GitHub Desktop.
gc timings fixed
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.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