Java:静态初始化块中的方法比主方法慢

Java:静态初始化块中的方法比主方法慢,java,methods,Java,Methods,出于某种原因,当从主方法调用时,我的方法“bishops”比从静态初始化块调用时运行得快得多。这是正常的,还是错误 public class Magic { public static void main(String[] args) { bishops(); } public static void bishops() { //PrintWriter out = new PrintWriter(new BufferedW

出于某种原因,当从主方法调用时,我的方法“bishops”比从静态初始化块调用时运行得快得多。这是正常的,还是错误

public class Magic
{
    public static void main(String[] args)
    {
        bishops();
    }

    public static void bishops()
    {
        //PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("bishops.txt")));
        BISHOP_SHIFTS = new int[64];
        BISHOP_COMBOS = new long[64][];
        for (int square = 0; square < 64; square++) {System.out.println("bbb " + square);
            int NUMBER = bitCount(BISHOP_ATTACKS[square]);
            BISHOP_SHIFTS[square] = 64 - NUMBER;
            long x = BISHOP_ATTACKS[square];
            long[] MAPS = new long[NUMBER];
            for (int n = 0; n < NUMBER; n++) {
                int i = bitScan(x);
                MAPS[n] = (1L << i);
                x -= MAPS[n];
            }
            int C = 1 << NUMBER;
            BISHOP_COMBOS[square] = new long[C];
            for (int i = 0; i < C; i++) {
                BISHOP_COMBOS[square][i] = 0;
                int j = i;
                for (int n = 0; n < NUMBER; n++) {
                    if ((j & 1) == 1)
                        BISHOP_COMBOS[square][i] |= MAPS[n];
                    j >>>= 1;
                }
                //out.println("SQUARE " + square);
                //out.println(toBitboardString(BISHOP_COMBOS[square][i]));
                //out.println();
            }
        }
        //out.close();

        bishopMagics();
    }

    public static void bishopMagics()
    {
        BISHOP_MAGICS = new long[64];
        Random r = new Random();

        for (int square = 0; square < 64; square++) {System.out.println("asdffff " + square);
            int i;
            int LENGTH = BISHOP_COMBOS[square].length;
            long magic;
            do {
                magic = r.nextLong() & r.nextLong() & r.nextLong();
                //final int COUNT = bitCount(BISHOP_MASKS[square]);
                boolean[] used = new boolean[LENGTH];
                for (int j = 0; j < used.length; j++)
                    used[j] = false;
                for (i = 0; i < LENGTH; i++) {
                    int index = (int) ((BISHOP_COMBOS[square][i] * magic) >>> BISHOP_SHIFTS[square]);
                    if (used[index])
                        break;
                    else
                        used[index] = true;
                }
            } while (i < LENGTH);
            BISHOP_MAGICS[square] = magic;
            System.out.println(magic);
        }

        //bishopTable();
    }

    /*
     * Lots of stuff omitted
     */

    static
    {
        //bishops();
    }
}
公共类魔法
{
公共静态void main(字符串[]args)
{
主教();
}
公共主教()
{
//PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter)(“bishops.txt”));
BISHOP_SHIFTS=新整数[64];
BISHOP_COMBOS=新长[64][];
对于(intsquare=0;square<64;square++){System.out.println(“bbb”+square”);
int NUMBER=比特数(BISHOP_攻击[square]);
BISHOP_移位[平方]=64-数字;
长x=主教_攻击[正方形];
long[]映射=新的long[NUMBER];
对于(int n=0;n=1;
}
//out.println(“正方形”+正方形);
//out.println(toBitboardString(BISHOP_COMBOS[square][i]);
//out.println();
}
}
//out.close();
主教魔术();
}
公共静态无效主教法()
{
BISHOP_MAGICS=新长[64];
随机r=新随机();
对于(intsquare=0;square<64;square++){System.out.println(“asdffff”+square”);
int i;
int LENGTH=BISHOP_组合[square]。长度;
长魔术;
做{
magic=r.nextLong()&r.nextLong()&r.nextLong();
//最终整数计数=比特计数(BISHOP_掩码[平方]);
布尔值[]已使用=新布尔值[长度];
对于(int j=0;j>>BISHOP_移位[square]);
如果(使用[索引])
打破
其他的
已用[索引]=真;
}
}而(i<长度);
主教_MAGICS[广场]=魔法;
System.out.println(magic);
}
//主教表();
}
/*
*遗漏了很多东西
*/
静止的
{
//主教();
}
}

当JVM预热(加载类es并编译代码)时,第二次运行的速度将比第一次快得多。静态块总是先调用

试着从main()或静态块运行两次,看看每次需要多长时间


顺便说一句:我会删除控制台上的任何日志记录,因为这会大大降低代码的速度。

随着JVM的升温(加载类es并编译代码),第二次运行的速度会比第一次快得多。静态块总是先调用

试着从main()或静态块运行两次,看看每次需要多长时间



顺便说一句:我会删除控制台上的任何日志记录,因为这会大大降低代码的速度。

如何衡量“快得多”?当你说运行得更快时,你的意思是整个程序退出得更快,还是你实际上是在给方法执行本身计时?main不到1秒;在static中大约是10秒。我只看了终端输出到“time”it@function这不会给你带来有用或一致的结果。例如,请参阅。你如何衡量“更快”呢?当你说运行得更快时,你的意思是整个程序退出得更快,还是你实际上是在给方法执行本身计时?main不到1秒;在static中大约是10秒。我只看了终端输出到“time” it@function这不会给您提供有用或一致的结果。例如,请参阅。虽然它只显示JIT编译器引起的差异,但您可以使用标记
-Djava.compiler=NONE
禁用它。当您调用
java
@ThomasOwens时,它仍然必须在第一次加载类和方法,而它没有必须做第二次。@Peter你说得对;我在静态初始化块中尝试了两次调用Bishop;第一次调用很慢,第二次调用很快。我会在5分钟内接受答案。但是,还有什么方法可以解决这个问题吗?我需要在静态初始化块中调用Bishop…你已经证明了这没有区别e是否在静态块中调用。问题是JVM预热所需的时间。解决此问题的唯一方法是让JVM一直运行并将其用作服务。即,不要继续重新启动它。尽管它只显示JIT编译器引起的差异,但可以使用标志
-Djava.compiler禁用它=NONE
当您调用
java
@ThomasOwens时,它仍然必须在第一次加载类和方法,而不必在第二次加载这些类和方法。@Peter您是对的;我在静态初始化块中尝试了两次调用bishops;第一次调用很慢,第二次调用很快。我将在5分钟内接受答案,但是无论如何都有办法解决这个问题吗?我需要在静态init块中调用bishop…您已经证明,它在静态块中调用与否没有任何区别。问题是JVM预热所需的时间。解决这个问题的唯一方法是让JVM一直运行并将其用作服务。即,不要继续重新启动把它弄得乱七八糟。