Есть ли лучший способ получить более точное время между потоками? - PullRequest
0 голосов
/ 28 июня 2019

Я работаю в HiveMQ, и у меня есть два клиента по одному в каждом потоке, и у меня есть основной поток, который запускает эти два потока.Я использовал System.nanoTime() для определения времени как отправки (для одного потока), так и получения (для другого потока), чтобы я мог сложить значения, чтобы получить общее время отправки и получения определенного количества сообщений.Я использовал синхронизированный блок с wait() и notify() в Java, чтобы таймеры запускались примерно в одно и то же время, когда один поток должен будет пробудить другой.Кажется, что мое окончательное время отправки и получения варьируется от 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 голосов
/ 01 июля 2019

Всякий раз, когда вы проводите тестирование производительности, вам нужно задавать себе ТОЧНО, что вы хотите измерить?Что может повлиять на результаты?Тогда тест должен отразить это.

Что касается значимых результатов: 15 сообщений недостаточно, чтобы сделать какие-либо выводы.Вы могли бы запустить тест именно в то время, когда в вашей системе что-то выполнялось, что делало числа медленнее, чем обычно.Мое эмпирическое правило таково: запускайте тест как минимум в течение 10 секунд, чтобы предотвратить случайные помехи.С другой стороны, его длительный запуск увеличит вероятность помех.

Затем выполните тест не менее 3 раз и найдите среднее стандартное отклонение.Мы не принимаем тесты с более чем 10% стандартным значением.

...