Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加速数据记录代码_C++ - Fatal编程技术网

C++ 加速数据记录代码

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

我有一个以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.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>开始的,而不是''。我的第一个猜测是一切都很好,而 GETICKCONTUTE()/CUT>是罪魁祸首。您看到的11ms间隔是低分辨率系统定时器的典型间隔。改变的可能是
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