Java 中字节数组到 29 位整数的最快且最有效的转换
由于 29 位整数在 AMF 中很流行,我想合并已知的最快/最好的例程。我们的库中当前存在两个例程,可以在 ideone 上进行实时测试 http://ideone.com/KNmYT
这是快速参考的来源 <代码>
public static int readMediumInt(ByteBuffer in) {
ByteBuffer buf = ByteBuffer.allocate(4);
buf.put((byte) 0x00);
buf.put(in.get());
buf.put(in.get());
buf.put(in.get());
buf.flip();
return buf.getInt();
}
公共静态 int readMediumInt2(ByteBuffer in) {
byte[] 字节 = 新字节[3];
in.get(字节);
整数值=0;
val += 字节[0] * 256 * 256;
val += 字节[1] * 256;
val += 字节[2];
如果(值<0){
值 += 256;
}
返回值;
}
Since 29 bit integers are popular in AMF, I would like to incorporate the fastest / best routine known. Two routines currently exist in our library and can be tested live on ideone
http://ideone.com/KNmYT
Here is the source for quick reference
public static int readMediumInt(ByteBuffer in) { ByteBuffer buf = ByteBuffer.allocate(4); buf.put((byte) 0x00); buf.put(in.get()); buf.put(in.get()); buf.put(in.get()); buf.flip(); return buf.getInt(); }public static int readMediumInt2(ByteBuffer in) { byte[] bytes = new byte[3]; in.get(bytes); int val = 0; val += bytes[0] * 256 * 256; val += bytes[1] * 256; val += bytes[2]; if (val < 0) { val += 256; } return val; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
通常我会通过位运算来完成此操作。第二个版本最终可能会被 JVM 优化到接近此的程度,但无法确定。现在,按照您的示例,这只是 24 位,但问题是“29 位整数”。我不确定你真正想要哪个。
Usually I'd do this with bit operations. The second version might eventually get optimized to something close to this by the JVM, but one can't be sure. Now, this is only 24 bits, following your samples, but the question says "29 bit integer". I'm not sure which you really wanted.
如果您确实想读取 AMF 29 位整数,这应该可以完成工作(假设我已经正确理解了格式):
If you do actually want to read AMF 29-bit integers, this should do the job (assuming i've understood the format correctly):
最重要的变化是避免在方法内分配对象。顺便说一句,您的微基准测试没有重置“开始”,因此第二个结果包括第一个方法所用的时间。另外,您需要多次运行微基准测试,否则即时编译器没有机会运行。我建议使用类似的方法
完整的代码是:
我的结果:
The most important change is to avoid allocating objects within the method. By the way your micro benchmark didn't reset "start", so the second result includes the time used for the first method. Also, you need to run micro benchmarks multiple times, otherwise the just in time compiler has no chance to run. I suggest to use a method similar to
The complete code is:
My results: