三元条件导致Java中奇怪的CPU使用
我运行这段代码是为了比较计算环绕坐标的3种等效方法的性能:三元条件导致Java中奇怪的CPU使用,java,cpu-usage,ternary-operator,Java,Cpu Usage,Ternary Operator,我运行这段代码是为了比较计算环绕坐标的3种等效方法的性能: public class Test { private static final float MAX = 1000000; public static void main(String[] args) { long time = System.currentTimeMillis(); for (float i = -MAX; i <= MAX; i++) {
public class Test {
private static final float MAX = 1000000;
public static void main(String[] args) {
long time = System.currentTimeMillis();
for (float i = -MAX; i <= MAX; i++) {
for (float j = 100; j < 10000; j++) {
method1(i, j);
//method2(i, j);
//method3(i, j);
}
}
System.out.println(System.currentTimeMillis() - time);
}
private static float method1(float value, float max) {
value %= max + 1;
return (value < 0) ? value + max : value;
}
private static float method2(float value, float max) {
value %= max + 1;
if (value < 0)
value += max;
return value;
}
private static float method3(float value, float max) {
return ((value % max) + max) % max;
}
}
公共类测试{
私有静态最终浮动最大值=1000000;
公共静态void main(字符串[]args){
长时间=System.currentTimeMillis();
对于(float i=-MAX;i在审查了各种评论并未能持续复制该行为后。我认为这确实是JRE的侥幸。由于这些评论,我了解到这种基准测试方法不是很有用,我应该使用微观基准测试框架,如谷歌的卡尺来测试这种微小的dif引用
我发现了一些资源:
你没有在这里生成任何新线程。它也不会神奇地为你这样做。如果你看到多个cpu正在使用,要么你的GC疯了,要么你的cpu监控不正确。我怀疑是GC。区别不会在三元运算符中-它将在+=
和+
之间,因为前者是doesn不需要为新值留出空间,后者需要。我想你指的是线程,而不是进程。我支持GC假设,但我想知道你是如何注意到线程正在生成的。没有那么重要,但我在我的框中运行了它,得到的时间几乎相同,第三个稍微慢一点。另外,请记住h保留多个线程并不一定会导致使用多个内核。根据目前的描述,我猜既不是GC也不是任何其他与程序相关的开销。听起来你只是(意外地)在上一次运行尚未完成时单击“运行”按钮多次启动程序(因为,正如你所说,需要“20分钟才能完成”)…投票关闭此程序。请阅读有关微基准点的内容。您的代码没有任何副作用,因此热点编译器可能会在任何时候启动,并决定没有任何可计算的内容。我对许多线程的牵强猜测是编译器线程。为了确保编译器不会优化所有内容,只需总计t他将你的方法输出并最终打印出来。只是一个站点注释:它可能无论如何都不相关。即使你有一个与之相关的场景,那么上下文也很重要:JIT前后发生的事情可以内联或优化它。如果你使用一个好的基准框架(JMH)综合测试单个条件的性能可能更好,但在实际代码中可能不同(并且与性能无关)。