我正在测试打开USB2Serial端口nCentOS7.4的时间成本。但我第一次发现它的价格大约是7ms。但在下一个开幕式上花费的时间要多得多。如果我增加睡眠时间,再次运行,它需要更多的时间,除了第一次打开。
我正在使用来自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毫秒
我只是想知道为什么开放时间在第一次之后会变得更长。也许在关门前还需要做些别的手术。
有人遇到过类似的问题吗?或者有什么评论吗?谢谢
发布于 2018-09-20 12:57:05
std::chrono::duration_cast返回一个std::chrono::duration 对象。
printf函数是一个老的C兼容性函数,因此对C++对象一无所知。
简而言之,您正在打印的不是真正的持续时间,而是https://en.wikipedia.org/wiki/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++。
https://stackoverflow.com/questions/52425537
复制相似问题