我比较了一些答案,因为我很好奇哪个是最快的。
看起来 Bohemian 的方法是最快的,但我无法解释为什么第一次运行时它慢了 11%。
PS.:我没有检查答案的正确性。
以下是代码:
public class Test
{
public static void main(String[] args)
{
final int RUNS = 10;
final int TRIPLE = 3;
final int N = 100000000;
byte[] bytes = new byte[TRIPLE * 32768];
Random r = new Random();
r.nextBytes(bytes);
List<ByteConvertTester> testers = Arrays.asList(new Harold(), new Bohemian(), new Ppeterka());
for (int i = 0; i < RUNS; i++)
{
System.out.println("RUN#" + i);
System.out.println("----------------------");
Integer compare = null;
for (ByteConvertTester tester : testers)
{
System.out.println(tester.getClass().getSimpleName());
long time = testAndMeasure(tester, bytes, N);
System.out.print("time (in ms): " + time);
if (compare != null) {
System.out.println(" SpeedUp%: " + (double) ((int) (10000 * (1.0d - (double) time / compare))) / 100);
} else {
compare = (int) time;
System.out.println();
}
}
System.out.println("----------------------");
}
}
private static long testAndMeasure(ByteConvertTester bct, byte[] bytes, int loops)
{
Calendar start = Calendar.getInstance();
int r;
for (int i = 0; i < loops; i += 3)
r = bct.test(bytes[i % bytes.length], bytes[(i + 1) % bytes.length], bytes[(i + 2) % bytes.length]);
Calendar end = Calendar.getInstance();
long time = (end.getTimeInMillis() - start.getTimeInMillis());
return time;
}
}
interface ByteConvertTester
{
public int test(byte msb, byte mid, byte lsb);
}
class Harold implements ByteConvertTester
{
@Override
public int test(byte msb, byte mid, byte lsb)
{
return (lsb & 0xFF) | ((mid & 0xFF) << 8) | ((msb & 0x0F) << 16);
}
}
class Bohemian implements ByteConvertTester
{
@Override
public int test(byte msb, byte mid, byte lsb)
{
return ((msb << 28) >>> 12) | (mid << 8) | lsb;
}
}
class Ppeterka implements ByteConvertTester
{
@Override
public int test(byte msb, byte mid, byte lsb)
{
return ((msb & 0x0F) << 16) + ((mid & 0xFF) << 8) + (lsb & 0xFF);
}
}
OUTPUT
RUN#0
Harold
time (in ms): 489
Bohemian
time (in ms): 547 SpeedUp%: -11.86
Ppeterka
time (in ms): 479 SpeedUp%: 2.04
RUN#1
Harold
time (in ms): 531
Bohemian
time (in ms): 521 SpeedUp%: 1.88
Ppeterka
time (in ms): 537 SpeedUp%: -1.12
RUN#2
Harold
time (in ms): 531
Bohemian
time (in ms): 539 SpeedUp%: -1.5
Ppeterka
time (in ms): 532 SpeedUp%: -0.18
RUN#3
Harold
time (in ms): 529
Bohemian
time (in ms): 519 SpeedUp%: 1.89
Ppeterka
time (in ms): 531 SpeedUp%: -0.37
RUN#4
Harold
time (in ms): 527
Bohemian
time (in ms): 519 SpeedUp%: 1.51
Ppeterka
time (in ms): 530 SpeedUp%: -0.56
RUN#5
Harold
time (in ms): 528
Bohemian
time (in ms): 519 SpeedUp%: 1.7
Ppeterka
time (in ms): 532 SpeedUp%: -0.75
RUN#6
Harold
time (in ms): 529
Bohemian
time (in ms): 520 SpeedUp%: 1.7
Ppeterka
time (in ms): 532 SpeedUp%: -0.56
RUN#7
Harold
time (in ms): 529
Bohemian
time (in ms): 520 SpeedUp%: 1.7
Ppeterka
time (in ms): 533 SpeedUp%: -0.75
RUN#8
Harold
time (in ms): 530
Bohemian
time (in ms): 521 SpeedUp%: 1.69
Ppeterka
time (in ms): 532 SpeedUp%: -0.37
RUN#9
Harold
time (in ms): 529
Bohemian
time (in ms): 527 SpeedUp%: 0.37
Ppeterka
time (in ms): 530 SpeedUp%: -0.18
+
的绑定比<<
更强。 - harold