我正在测试在Centos 7.4中打开USB2Serial
端口的时间成本。但是我发现它第一次花费了大约7毫秒。但这在下一次开放中花费了更多时间。如果增加睡眠时间,请再次运行,除了第一次打开外,它会花费更多时间。
我正在使用FTDI的usb2serial
设备,内核驱动程序是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毫秒
我只是想知道为什么开放时间在第一次之后就变得更长。关闭前可能需要其他操作。
有人遇到过类似的问题吗?或有何评论?谢谢
答案 0 :(得分:0)
std::chrono::duration_cast
返回一个std::chrono::duration
对象 。
printf
函数是旧的C兼容性函数,因此对C ++对象一无所知。
简而言之,您要打印的不是持续时间,而是undefined behavior!,因为考虑到您使用的是Ubuntu,那么您正在使用GCC或Clang,这两个编译器都应该对此抱怨。
如果要打印实际持续时间“计数”,请使用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函数混合使用。它们很少混合得很好。
您可能还想考虑使用getting a few good books来帮助您正确学习C ++。