所以我想对一些基本的java功能进行基准测试,以便为这个问题添加一些信息:将方法声明为静态会带来什么好处.
我知道写作基准有时并不容易,但这里发生的事情我无法解释.
请注意,我并没有考虑如何解决这个问题,而是为什么会发生这种情况*
测试类:
public class TestPerformanceOfStaticVsDynamicCalls {
private static final long RUNS = 1_000_000_000L;
public static void main( String [] args ){
new TestPerformanceOfStaticVsDynamicCalls().run();
}
private void run(){
long r=0;
long start, end;
for( int loop = 0; loop<10; loop++ ){
// Benchmark
start = System.currentTimeMillis();
for( long i = 0; i < RUNS; i++ ) {
r += addStatic( 1, i );
}
end = System.currentTimeMillis();
System.out.println( "Static: " + ( end - start ) + …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Unsafe迭代内存而不是遍历byte []中的值.使用unsafe分配内存块.内存足以容纳65536个字节值.
我在尝试这个:
char aChar = some character
if ((byte) 0 == (unsafe.getByte(base_address + aChar) & mask)){
// do something
}
Run Code Online (Sandbox Code Playgroud)
代替:
char aChar = some character
if ((byte) 0 == ( lookup[aChar] & mask )){
// do something
}
Run Code Online (Sandbox Code Playgroud)
我认为 Unsafe可以比使用常规数组访问更快地访问内存,并对每个索引执行索引检查...
只是一厢情愿地认为jvm会有一个特殊的操作(不安全),它会以某种方式使常规数组访问和迭代更快.在我看来,jvm在正常的byte []迭代中运行良好,并且可以使用普通的,纯粹的,vanilla java代码快速完成它们.
@millimoose击中众所周知的"钉在头上"
"不安全可能对许多事情都有用,但这种微观优化程度不是其中之一." - 毫米"
在非常严格的有限情况下使用Unsafe会更快:
使用Unsafe(在我的测试中)比较慢:
即使server调用了jvm选项也会更慢
在32位jvm(64位甚至更慢?)下面的代码中,不安全从9%或更多(1_GB数组和UnsafeLookup_8B(最快的一个)慢)
这有什么理由吗?**
当我运行下面发布的代码yellowB(检查1GB字节[])时,法线仍然是最快的:
C:\Users\wilf>java -Xms1600m -Xprof -jar "S:\wilf\testing\dist\testing.jar"
initialize data...
initialize data …Run Code Online (Sandbox Code Playgroud)