Nice catch @noel!
I’ve just assumed a solution w/ StringBuilder would be faster, but I was wrong.
Actually reverseSlow() is more than 2x faster than reverseFast()!
However the Java/Pjs cross-mode reverseStr() is absurdly slower than the Java-only versions.
// Discourse.Processing.org/t/rosetta-challenge-reverse-a-string/20644/14
// GoToLoop (2020/May/09)
static final String STR = "àéïõû";
static final int ITERS = 10_000_000, LOOPS = 3, FUNCTS = 4;
final IntList timers = new IntList(LOOPS * FUNCTS);
void setup() {
println("reverseStr(), reverseUnicode(), reverseSlow(), reverseFast()");
for (int i = 0; i < LOOPS; ++i) {
reverseStrMillis();
reverseUnicodeMillis();
reverseSlowMillis();
reverseFastMillis();
println(timers);
}
exit();
}
void reverseStrMillis() { // slowest
final int start = millis();
String s;
for (int i = 0; i < ITERS; ++i) s = reverseStr(STR);
timers.append(millis() - start);
}
void reverseUnicodeMillis() { // slow
final int start = millis();
String s;
for (int i = 0; i < ITERS; ++i) s = reverseUnicode(STR);
timers.append(millis() - start);
}
void reverseSlowMillis() { // fastest
final int start = millis();
String s;
for (int i = 0; i < ITERS; ++i) s = reverseSlow(STR);
timers.append(millis() - start);
}
void reverseFastMillis() { // fast
final int start = millis();
String s;
for (int i = 0; i < ITERS; ++i) s = reverseFast(STR);
timers.append(millis() - start);
}
static final String reverseStr(final String s) { // slowest
return join(reverse(s.split("")), "");
}
static final String reverseUnicode(final CharSequence s) { // slow
final int[] reversedUnicodes = reverse(s.codePoints().toArray());
return new String(reversedUnicodes, 0, reversedUnicodes.length);
}
static final String reverseSlow(final String s) { // fastest
return new String(reverse(s.toCharArray()));
}
static final String reverseFast(final CharSequence s) { // fast
return new StringBuilder(s).reverse().toString();
}