c++ - 为什么打开USB2Serial端口比第一次花费更长的时间
问题描述
我正在测试打开一个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
成员函数,最好与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++。
推荐阅读
- db2 - 执行 ALTER COLUMN 后无法访问 IBM Cloud 表上的 Db2 Lite 计划
- typescript - 可以获取 typeof 泛型类型参数吗?
- c# - 如何在 Xamarin.UWP 应用程序中实现 LongPress?
- java - Spring security ADFS SSO 集成 - 响应没有任何可以通过主题验证的有效断言
- discord - Discord py OSError: [WinError 121] 信号量超时期限已过
- python - 删除行索引并将它们恢复为列
- api - Kotlin 语言的 API 参考
- django - django channel_layer.send 不同步甚至使用 async_to_sync
- python - 如何根据用户输入打印字符串 x 次
- scala - Amazon SES 凭证格式 - 将 Scala 应用程序(Play 框架)从 Sendgrid 迁移到 SES