Я проверяю стоимость времени открытия USB2Serial
порт n Centos 7.4. Но я нашел, что это стоило приблизительно 7 мс впервые. Но в следующем открытии это стоило гораздо больше времени. Если я увеличу время сна, запустите снова, это будет стоить больше времени, кроме первого открытия.
я использую usb2serial
устройство от FTDI, драйвер ядра — ftdi_sio.
Вот мой код:
for (int i = 0; i < 10; i++)
{
steady_clock::time_point start = steady_clock::now();
int handle = open("/dev/ttyUSB0", O_RDWR| O_NONBLOCK | O_NDELAY);
steady_clock::time_point end = steady_clock::now();
std::cout << "Item " << i << ":" << " " << duration_cast<std::chrono::nanoseconds>(end-start).count()/1000000 << " ms" << endl;
usleep(10000); // us
close(handle);
}
Результат:
Элемент 0: 6 мс
Элемент 1: 76 мс
Элемент 2: 75 мс
Элемент 3: 75 мс
Элемент 4: 75 мс
Элемент 5: 76 мс
Элемент 6: 75 мс
Элемент 7: 75 мс
Элемент 8: 75 мс
Элемент 9: 74 мс
Мне просто интересно, почему открытое время становится длиннее после первого раза. Может быть, нужна другая операция, прежде чем закрыть.
Кто-нибудь сталкивался с подобной проблемой? Или какие-либо комментарии? Спасибо
std::chrono::duration_cast
возвращает std::chrono::duration
объект.
printf
функция старая функция совместимости C, и, как таковая, знает ничего такого о C ++ объектах.
Короче говоря, то, что вы печатаете, в действительности не является продолжительностью, вместо этого у вас есть неопределенное поведение! Учитывая, что вы работаете в Ubuntu, вы используете GCC или Clang, оба компилятора, которые должны жаловаться на это.
Если вы хотите напечатать фактическую длительность «count», используйте count
функция-член, предпочтительно вместе с std::cout
чтобы получить безопасные для типов преобразования:
std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1).count() << " ns\n";
Или, если ваш компилятор может обрабатывать некоторые изменения в будущем стандарте C ++ 20 (который определяет operator<<
перегрузка на длительность):
std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1) << " ns\n";
Большой урок: не смешивайте C ++ и старые функции C. Они редко смешиваются очень хорошо.
Вы также можете рассмотреть получить несколько хороших книг чтобы помочь вам выучить C ++ правильно.
Других решений пока нет …