The repeat method in LZDecoder[1] currently copies individual bytes in a loop. This could be changed to do batch copies:
do { //it is possible for the "repeat" to include content which is going to be generated here //so we have to limit ourselves to how much data is already in the buffer (i.e. pos - back). final int toCopy = Math.min(left, Math.min(bufSize - back, pos - back)); System.arraycopy(buf, back, buf, pos, toCopy); pos += toCopy; back += toCopy; left -= toCopy; if (back == bufSize) { back = 0; } } while (left > 0); [1] - https://git.tukaani.org/?p=xz-java.git;a=blob;f=src/org/tukaani/xz/lz/LZDecoder.java;h=85b2ca1117461c9f3143e3baf592ab261e2ad1ca;hb=refs/heads/master#l79