Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Performance JMeter';s纳米线程睡眠属性-如何使用它?_Performance_Jmeter_Benchmarking_Jmeter Plugins_Nanotime - Fatal编程技术网

Performance JMeter';s纳米线程睡眠属性-如何使用它?

Performance JMeter';s纳米线程睡眠属性-如何使用它?,performance,jmeter,benchmarking,jmeter-plugins,nanotime,Performance,Jmeter,Benchmarking,Jmeter Plugins,Nanotime,我正在设置一个负载测试解决方案,并且在阅读JMeter的文档时,我发现您可以为测试计划设置许多属性。我已经有了运行良好的测试,并生成了结果、图表等,但当我试图对JMeter和结果的准确性等有更深入的了解时,我遇到了下面的简介 从中,我读到以下内容: # Whether to use System.nanoTime() - otherwise only use System.currentTimeMillis() sampleresult.useNanoTime=true # Use a bac

我正在设置一个负载测试解决方案,并且在阅读JMeter的文档时,我发现您可以为测试计划设置许多属性。我已经有了运行良好的测试,并生成了结果、图表等,但当我试图对JMeter和结果的准确性等有更深入的了解时,我遇到了下面的简介

从中,我读到以下内容:

# Whether to use System.nanoTime() - otherwise only use System.currentTimeMillis()
sampleresult.useNanoTime=true

# Use a background thread to calculate the nanoTime offset
# Set this to <= 0 to disable the background thread
sampleresult.nanoThreadSleep=5000
#是否使用System.nanoTime()-否则仅使用System.currentTimeMillis()
sampleresult.useNanoTime=true
#使用背景线程计算纳米时间偏移

#设置为查看JMeter代码,我发现下面的部分是我感兴趣的部分。因此,基本上后台线程是一个休眠
NANOTHREAD\u SLEEP
毫秒的线程,当它醒来时,它会询问时间

该值必须尽可能高,以避免增加采样的开销,但必须尽可能低,以提供足够的精度

如果不使用nanothread,那么所有时间都是使用System.nanoTime()计算的,这可能会也可能不会提供额外的准确性。通常,高精度计数器受频率变化的影响很大(例如,由于节能模式)。我的意见是,您不必担心使用System.nanoTime(),因为您将无法以纳秒级的精度获得测试的可重复性。即使是毫秒也似乎是一个很短的时间间隔

为什么要使用后台线程来计算时间?我认为这是因为如果线程只测量时间,那么在执行过程中,您可以随时询问它当前时间。如果不使用后台线程,我认为时间只在采样点更新。启用线程后,我认为时间会更新得更频繁(只要考虑到
NANOTHREAD\u SLEEP
)。我还没有写JMeter,但我认为这就是时间线索背后的哲学

这有用吗?它可能会压缩额外的精度。但是,JMeter用于测试Web应用程序的性能,由于网络延迟、资源使用等原因,重复性较差。即使测量纳秒,人们也会对秒和毫秒部分更感兴趣,并且测试是可重复的

代码:

private static class NanoOffset extends Thread {

    private static volatile long nanoOffset; 

    static long getNanoOffset() {
        return nanoOffset;
    }

    @Override
    public void run() {
        // Wait longer than a clock pulse (generally 10-15ms)
        getOffset(30L); // Catch an early clock pulse to reduce slop.
        while(true) {
            getOffset(NANOTHREAD_SLEEP); // Can now afford to wait a bit longer between checks
        }
    }

    private void getOffset(long wait) {
        try {
            TimeUnit.MILLISECONDS.sleep(wait);
            long clock = System.currentTimeMillis();
            long nano = SampleResult.sampleNsClockInMs();
            nanoOffset = clock - nano;
        } catch (InterruptedException ignore) {
            // ignored
        }
    }        
}

回答得很好。感谢您深入了解代码,并回答我的每一个问题。有时我会因为树木而错过森林,我想我在这里做到了,担心精确度达到纳秒级,就像你说的,我们关注的是秒,而不是毫秒,测试需要可重复和精确,精确到纳秒级。再次感谢你!