【发布时间】:2013-01-03 22:58:19
【问题描述】:
假设我有一个具有以下签名的方法:
public int indexOf(byte[] bytes, byte toFind, int offset, int length) {
...
}
这个方法做了一些简单的事情,比如在bytes 的[offset, offset+length) 范围内查找字节toFind。我想预先检查偏移量和长度是否对bytes 有效。也就是说,偏移量和偏移量+长度以字节为单位。
显式检查类似于:
if (offset < 0 || offset > bytes.length - length) {
throw ...; // bad santa!
}
似乎我可以通过执行“虚拟”数组访问来更便宜地执行此操作(就发出的字节码而言,也许还有运行时性能):
public int indexOf(byte[] bytes, byte toFind, int offset, int length) {
int dummy = bytes[offset] + bytes[offset + length - 1];
...
}
如果可以的话,我想摆脱int dummy 和+,或者降低它们的成本。编译器不喜欢像bytes[offset]; 这样的独立访问,大概是因为这样的表达式通常没有副作用并且毫无意义(但在这种情况下并非如此)。使用 dummy int 也会导致编译器警告,必须禁止该警告。
关于如何用最少的字节码进行更改的任何建议(运行时性能在这里也很重要,但我怀疑大多数解决方案都被优化为与删除未使用部分相同的东西)。
【问题讨论】:
-
以下形式的评论:“你分析过这个吗?”、“这真的是你的应用程序的瓶颈吗”、“几个字节/纳秒在这里很重要”、“闻起来像过早优化”将是忽略。
-
可以直接操作字节码吗?还是您仅限于发出 Java 代码?
-
@templatetypedef - 仅限 .java 代码。
-
您是否要尽量减少生成的字节码?或者最小化运行时间?
-
@BeeOnRope 请注意,您的 2 个示例并不等效。特别是,例如,对于 offset = 3 和 length = -1,第一个会引发异常,而第二个不会。
标签: java arrays performance jvm micro-optimization