相关疑难解决方法(0)

一些运行/ JIT错误后,Java循环变慢了?

所以我想对一些基本的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)

java performance benchmarking jit

11
推荐指数
1
解决办法
1371
查看次数

**BUSTED**如何使用sun.misc.Unsafe加快字节[]查找速度?

我正在尝试使用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会更快:

  • (仅64位jvm)对于单个65535字节[]查找更快,每次测试只完成一次.在这种情况下,64_bit jvm上的UnsafeLookup_8B快24%.如果测试重复进行,每次测试都进行两次,那么正常方法现在比不安全快30%.在冷jvm上的纯解释模式中,Unsafe到目前为止更快 - 但只是第一次,仅适用于较小的数组大小.在32位标准Oracle JVM 7.x上,正常情况比使用unsafe快三倍.

使用Unsafe(在我的测试中)比较慢:

  • 在Oracle java 64位和32位虚拟机上都较慢
  • 无论操作系统和机器架构如何都会变慢(32位和64位)
  • 即使server调用了jvm选项也会更慢

  • 在32位jvm(64位甚至更慢?)下面的代码中,不安全从9%或更多(1_GB数组和UnsafeLookup_8B(最快的一个)慢)

  • 在64位jvm下,不安全性从234%或更高(1_MB数组和UnsafeLookup_1B(最快速度为1))变慢.

这有什么理由吗?**

当我运行下面发布的代码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)

java performance unsafe

7
推荐指数
1
解决办法
5638
查看次数

标签 统计

java ×2

performance ×2

benchmarking ×1

jit ×1

unsafe ×1