我正在学校做一个数独求解器,我们正在进行一场小小的表演比赛.现在,我的算法在第一次运行时(大约2.5ms)非常快,但是当我解决相同的谜题10 000次(每次运行大约0.5ms)时更快.当然,这些时间取决于正在解决的难题.我知道JVM在多次调用方法时会做一些优化,这是我怀疑正在发生的事情.
我不认为我可以进一步优化算法本身(虽然我会继续寻找),所以我想知道我是否可以复制JVM完成的一些优化.
注意:编译为本机代码不是一种选择
谢谢!
编辑:所有这些VM选项都很好,但在算法竞赛中并不真正“合法”,因为每个人都可以使用这些选项并获得性能提升.我正在寻找代码优化.
解决方法
tl; dr:不,JVM完成的大多数优化都不能用
Java字节代码表示.
就其本质而言,Java字节代码在很高的层次上定义了您的代码.
这是设计上的原因之一,也是JVM可以完成所有优化的原因之一:字节代码描述了相对较高级别的操作,并将实际执行细节留给了JVM.
由于这一事实,大多数优化不能用字节代码本身表示.
例如,JVM规范指定超出数组边界的每个数组访问都必须抛出ArrayIndexOutOfBoundsException(参见VM Spec 2.5.14).
但是,如果智能JVM知道它们已经发生(例如,当迭代数组时,那么JVM可以在迭代之前实际执行边界检查并在每次迭代期间跳过它),它可以优化掉许多检查.