Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 奇怪的分析器结果_Java_Performance - Fatal编程技术网

Java 奇怪的分析器结果

Java 奇怪的分析器结果,java,performance,Java,Performance,我只是试着用jvisualvm分析一个相对简单的java程序。结果有点奇怪:一个小的4线方法有最多的自我时间,明显超过任何其他方法 public class Hub public void clock() { for (int i = 0; i < cogs.length; i++) { cogs[i].clock(cnt, i, this); } cnt++; } } 但这不应该有那么大的影响!这是

我只是试着用jvisualvm分析一个相对简单的java程序。结果有点奇怪:一个小的4线方法有最多的自我时间,明显超过任何其他方法

public class Hub
    public void clock() {
        for (int i = 0; i < cogs.length; i++) {
            cogs[i].clock(cnt, i, this);
        }
        cnt++;
    }
}
但这不应该有那么大的影响!这是一张证明图片:


评测会影响代码的运行时间,因为它会插入(修改)代码。在9000毫秒内运行了12000次调用,即每次调用大约750纳秒,这是在插装使其变慢之后,因此如果没有插装,可能会更少。在每次调用时,我不会期望从探查器中得到任何合理的结果,也不会比较不同方法的结果,很可能调用次数较多的方法会比调用次数较少的方法得到更高的分数(如果大多数
Cog.clock
调用只检查状态和退出)。您可以尝试使用VisualVM采样器,但我不确定它是否足够准确。您可以尝试自己测量时间(使用
System.nanoTime()
),但即使这样也不能保证达到亚微秒的精度。

评测会影响代码的运行时间,因为它会检测(修改)代码。在9000毫秒内运行了12000次调用,即每次调用大约750纳秒,这是在插装使其变慢之后,因此如果没有插装,可能会更少。在每次调用时,我不会期望从探查器中得到任何合理的结果,也不会比较不同方法的结果,很可能调用次数较多的方法会比调用次数较少的方法得到更高的分数(如果大多数
Cog.clock
调用只检查状态和退出)。您可以尝试使用VisualVM采样器,但我不确定它是否足够准确。您可以尝试自己测量时间(使用
System.nanoTime()
),但即使这样也不能保证达到亚微秒的精度。

您调用
clock()
的次数是多少?代码的其余部分在哪里?我编辑以澄清Hub.clock和Cog.clock之间的区别。基本上,Hub.clock在一个无休止的循环中被调用,然后在所有Cog对象上调用clock。我不太相信分析器。测量影响执行,存在许多问题。如果总运行时间真的只有10毫秒,那么你可以忘记它;JVM需要更多的资源来正确地优化一切。如果你没有遇到速度问题,那么你可以忽略它(我想我也很好奇这里到底发生了什么)。否则,进行更长时间的测量并公布结果。@maaartinus的总运行时间是10秒,而不是10毫秒。我基本上是以一种非常粗糙和快速的方式模拟多核CPU。问题是,即使跳过所有等待状态和大多数I/O硬件,它也不是很实时,即使只有两个内核在运行。减少内核的数量会使其速度有所加快,即使其他6个内核没有这样做!您要调用多少次
clock()
?代码的其余部分在哪里?我编辑以澄清Hub.clock和Cog.clock之间的区别。基本上,Hub.clock在一个无休止的循环中被调用,然后在所有Cog对象上调用clock。我不太相信分析器。测量影响执行,存在许多问题。如果总运行时间真的只有10毫秒,那么你可以忘记它;JVM需要更多的资源来正确地优化一切。如果你没有遇到速度问题,那么你可以忽略它(我想我也很好奇这里到底发生了什么)。否则,进行更长时间的测量并公布结果。@maaartinus的总运行时间是10秒,而不是10毫秒。我基本上是以一种非常粗糙和快速的方式模拟多核CPU。问题是,即使跳过所有等待状态和大多数I/O硬件,它也不是很实时,即使只有两个内核在运行。减少内核的数量会使其速度有所加快,即使其他6个内核没有这样做!
public class Cog
    public void clock(int cnt, int cogid, Hub hub) {
        if (state == State.STOP)
            return;
        //long code goes here
    }
}