Java:静态初始化块中的方法比主方法慢
出于某种原因,当从主方法调用时,我的方法“bishops”比从静态初始化块调用时运行得快得多。这是正常的,还是错误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
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一直运行并将其用作服务。即,不要继续重新启动把它弄得乱七八糟。