有没有更好的方法来跨线程获得更精确的时间?

时间:2019-06-28 16:30:38

标签: java mqtt hivemq

我正在使用HiveMQ,我有两个客户端,每个线程各一个,我有一个启动这两个线程的主线程。我一直在使用System.nanoTime()对发送(对于一个线程)和接收(对于另一线程)进行计时,因此我可以将这些值加起来以获得发送和接收给定数量的消息的总时间。 。我在Java中将同步块与wait()notify()一起使用,以便定时器几乎在同一时间启动,因为一个线程必须唤醒另一个线程。我最后一次发送和接收的时间大约是0-350毫秒,当我运行程序时,自然会发送和接收15条消息。对于上下文,服务器和客户端使用localhost作为服务器地址在同一台计算机上运行。无论如何,我可以在线程中获得更精确的时间(更少的变化)吗?我想获得尽可能高的精度。

用户代码(发送客户端):

scheduler.waitToReceive();  // makes the SubThread wait until the PubThread is ready to send a message 

            System.out.println("Timer started");
            startTime = System.nanoTime();

            for (int i = 1; i <= 15; i++) {  
                Mqtt5Publish receivedMessage = receivingClient1.receive(MESSAGEWAITTIME,TimeUnit.SECONDS).get(); // receives the message using the "publishes" instance                                                                         // .get() returns the object if available or throws a NoSuchElementException 
                PubSubUtility.convertMessage(receivedMessage);  // Converts a Mqtt5Publish instance to string and prints 
            }   
            endTime = System.nanoTime();

发布者代码(发布客户端):

readyToSend = true; 
        scheduler.notifyStartReceive();  // notifies SubThread it can starts receiving messages
        startTime = System.nanoTime();

            for (int i = 1; i <= 15; i++) { 
                 publisher.publishWith()    
                 .topic(publisherTopic)   // publishes to the specified topic
                 .qos(MqttQos.EXACTLY_ONCE)  // sets the quality of service to 2 
                 .payload(convertedMessage)  // the contents of the message 
                 .send();
            }           
        endTime = System.nanoTime();

1 个答案:

答案 0 :(得分:0)

无论何时进行性能测试,您都需要精确地问自己自己做什么 您要测量吗?什么会影响结果?然后测试需要反映出来。

对于有意义的结果:15条消息不足以得出任何结论。您 可能恰好在您的内容正在运行时运行测试 系统使数字比平常慢。我的经验法则是:在 至少持续10秒钟,以防止随机干扰。另一方面,将其运行到 长会增加干扰的可能性。

然后至少运行3次测试,并找到平均标准偏差。我们不 接受stddev超过10%的测试。