首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要比第一次打开USB2Serial端口花费更长的时间

为什么要比第一次打开USB2Serial端口花费更长的时间
EN

Stack Overflow用户
提问于 2018-09-20 12:48:13
回答 1查看 37关注 0票数 1

我正在测试打开USB2Serial端口nCentOS7.4的时间成本。但我第一次发现它的价格大约是7ms。但在下一个开幕式上花费的时间要多得多。如果我增加睡眠时间,再次运行,它需要更多的时间,除了第一次打开。

我正在使用来自FTDI的usb2serial设备,内核驱动程序是ftdi_sio。

这里是我的代码:

代码语言:javascript
复制
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毫秒

我只是想知道为什么开放时间在第一次之后会变得更长。也许在关门前还需要做些别的手术。

有人遇到过类似的问题吗?或者有什么评论吗?谢谢

EN

回答 1

Stack Overflow用户

发布于 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一起获得类型安全转换:

代码语言:javascript
复制
std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1).count() << " ns\n";

或者您的编译器是否能够处理即将发布的C++20标准中的一些更改(该标准定义了持续时间的operator<<重载):

代码语言:javascript
复制
std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1) << " ns\n";

最大的教训是:不要将C++和旧C函数混在一起。它们很少混合得很好。

您还可以考虑使用getting a few good books来帮助您正确地学习C++。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52425537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档