C++ 加速数据记录代码
我有一个以1KHz的速率输出64位二进制数据的设备。我正在通过第三方DLL通过USB读取设备,将二进制数据转换为浮点,给它加时间戳,然后写入文件 我目前有以下设置:C++ 加速数据记录代码,c++,C++,我有一个以1KHz的速率输出64位二进制数据的设备。我正在通过第三方DLL通过USB读取设备,将二进制数据转换为浮点,给它加时间戳,然后写入文件 我目前有以下设置: int main(int argc, char* argv[]) { unsigned char Message_Rx[64]; USHORT Bytes_Read=0; std::ofstream out(argv[1]); do { Result = Comms.USB
int main(int argc, char* argv[])
{
unsigned char Message_Rx[64];
USHORT Bytes_Read=0;
std::ofstream out(argv[1]);
do
{
Result = Comms.USBRead(&Message_Rx[0],&Bytes_Read);
unsigned long now = getTickCount(start);
if(Result != 0)
{
uint16_t msb (Message_Rx[11] & 0xff) \\leftshited 8;
uint16_t lsb (Message_Rx[12] & 0xff);
uint16_t rate = msb | lsb;
char outstring[1024];
sprintf(outstring, "%d\t%.7f", now, (float)rate*0.03125);
out << outstring << "\n";
}
}while(!kbhit());
out.close();
}
但是,当我在我需要使用的旧笔记本电脑上运行时,我会得到以块为单位显示的时间戳,看起来一定缺少一些数据:
143379582 -0.5937500
143379582 -1.5312500
143379582 -1.6250000
143379582 -1.4062500
143379582 -1.1875000
143379593 -1.3437500
143379593 -1.3125000
143379593 -1.3125000
143379593 -1.1562500
143379582 -0.5937500
143379582 -1.5312500
143379582 -1.6250000
143379582 -1.4062500
143379582 -1.1875000
143379593 -1.3437500
143379593 -1.3125000
143379593 -1.3125000
143379593 -1.1562500
有没有一种方法可以加速我的代码,这样我就不会丢失数据?说得很清楚:对于任何不是英特尔486SX的PC,64kb/s的速度都是非常可笑的。通过USB获得几Mb/s的速度对于小型、每件一美元的微控制器来说是非常可行的,无需任何优化。 任何出错的地方都比代码更需要调查 我不知道
Comms
库,但我会在那里寻找花费时间的地方
除此之外,将内容打印到屏幕上所需的时间应该比处理时间多几个数量级,但仍然不应该成为问题。如前所述,1kS/s*64 b/s对于现代(阅读:过去二十年)的PC硬件来说算不上什么。我建议将原始数据存储到按下键为止。按键后,输出数据 您希望删除高性能代码区域的格式和输出 改写一首歌,当数据完成后,将有足够的时间打印 编辑1:
基于数组的循环队列是保存传入数据的良好数据结构。这将为您提供最后N个数据示例。每当您遇到性能问题时,您的第一步应该是分析代码,以查看其中哪些部分占用了时间 但是,对于您的代码,我认为打印和字符串处理对于主循环是不必要的。我将有一个单独的时间戳数组,在我的主循环中只获取数据 在按下一个键之后,您就不再有时间限制,可以处理文件I/O的一些昂贵操作和字符串的生成 最后一点需要注意的是,您的操作系统可能正在窃取您的CPU周期。您可能希望尝试以更高的优先级运行代码,以排除调度
综上所述,如上所述,除非您运行的是真正老式的硬件,否则您的数据速率应该是可持续的。请粘贴有效代码。C++中的注释是从<代码> //< /COD>开始的,而不是''。我的第一个猜测是一切都很好,而
getTickCount()
实现,这在旧笔记本电脑上是低分辨率的。再想一想,在非RT操作系统中,您不太可能可靠地每毫秒获取一次实时数据。你的新电脑可能可以,但单核旧笔记本电脑可能不行。这并不意味着您不能可靠地获取数据,只是数据将从系统缓冲区读取(对于comm,通常为4KB,足够大),因此您可能每11ms获取11个样本。
143379582 -0.5937500
143379582 -1.5312500
143379582 -1.6250000
143379582 -1.4062500
143379582 -1.1875000
143379593 -1.3437500
143379593 -1.3125000
143379593 -1.3125000
143379593 -1.1562500