C++ 尝试优化每一帧将数据打印到二进制文件

C++ Attempt to optimize printing data to binary file for every frame

本文关键字:一帧 数据 打印 二进制文件 优化 C++      更新时间:2023-10-16
void demodlg::printData(short* data)
{
FILE* pF;
char buf[50];
snprintf(buf, sizeof(buf), "%s\%s\%s%d.binary", "test", "data", "data", frameNum++);
pF = fopen(buf, "wb");
int lines = frameDescr->m_numLines;
int samples = frameDescr->m_pLineTypeDescr[0].m_numSamples;
int l, s;
fprintf(pF, "t");
for (l = 0; l < lines; l++)
{
fprintf(pF, "%dt", l);
}
fprintf(pF, "n");
for (s = 0; s < samples; s++)
{
fprintf(pF, "%d)t", s);
for (l = 0; l < lines; l++)
{
fprintf(pF, "%dt", *(data + l * samples + s));
}
fprintf(pF, "n");
}
fclose(pF);
}

我有上面的代码片段,它只接收一些数据,然后将其写出到二进制文件中。这个函数每秒被调用大约 20-30 次,所以我正在尝试尽可能优化它。它写入的每个文件的大小约为 1 MB。理想情况下,我每秒能够写入 20-30 MB。截至目前,它还没有达到这个速度。

有人对如何进一步优化这一点有任何想法吗?

在更改为二进制文件之前,我最初是写入 txt 文件,但令人惊讶的是,差异并不太明显。

此外,frameDescr 会针对每一帧进行更新,因此我相信我确实需要从内部访问行和采样变量,不幸的是。

我发现这篇文章可以参考(以非常快的速度编写C++二进制文件(,但我不确定如何将它应用于我的。

下面是一个简短的示例,说明如何将数据数组写入二进制文件以及如何读回它。

我不明白您的代码中lines的概念或目的,所以我没有尝试复制它。如果您确实有其他数据需要写入以允许在读取时重建它,我已经放置了注释以注意您可以插入该代码的位置。

请记住,作为二进制写入的数据必须以相同的方式读取,因此,如果您以特定格式编写文本以从另一个程序使用它,那么二进制文件将对您不起作用,除非您修改该其他程序或创建一个额外的步骤来读取二进制数据并在使用前写入文本格式。

假设将数据写入二进制具有速度优势,则添加额外的步骤将二进制数据转换为文本格式是有益的,因为当您不尝试保持特定帧速率时,您可以离线执行此操作。

通常,由于您标记了此c++我更喜欢在向量中操作数据,也许使用 c++ 流来写入和读取数据,但我试图使其尽可能与您的代码相似。

#include <cstdio>
#include <stdint.h>
const size_t kNumEntries = 128 * 1024;
void writeData(const char *filename, int16_t *data, size_t numEntries)
{
FILE *f = fopen(filename, "wb");
if (!f)
{
fprintf(stderr, "Error opening file: '%s'n", filename);
return;
}
//If you have additional data that must be in the file write it here
//either as individual items that are mirrored in the reader,
//or using the pattern showm below for variable sized data.
//Write the number of entries we have to write to the file so the reader 
//will know how much memory to allocate how many to read.
fwrite(&numEntries, sizeof(numEntries), 1, f);
//Write the actual data
fwrite(data, sizeof(*data), numEntries, f);
fclose(f);
}
int16_t* readData(const char *filename)
{
FILE *f = fopen(filename, "rb");
if (!f)
{
fprintf(stderr, "Error opening file: '%s'n", filename);
return 0;
}
//If you have additional data to read, do it here. 
//This code whould mirror the writing function.
//Read the number of entries in the file.
size_t numEntries;
fread(&numEntries, sizeof(numEntries), 1, f);
//Allocate memory for the entreis and read them into it.
int16_t *data = new int16_t[sizeof(int16_t) * numEntries];
fread(data, sizeof(*data), numEntries, f);
fclose(f);
return data;
}
int main()
{
int16_t *dataToWrite = new int16_t[sizeof(int16_t) * kNumEntries];
int16_t *dataRead = new int16_t[sizeof(int16_t) * kNumEntries];
for (int i = 0; i < kNumEntries; ++i)
{
dataToWrite[i] = i;
dataRead[i] = 0;
}
writeData("test.bin", dataToWrite, kNumEntries);
dataRead = readData("test.bin");
for (int i = 0; i < kNumEntries; ++i)
{
if (dataToWrite[i] != dataRead[i])
{
fprintf(stderr, 
"Data mismatch at entry %d, : dataToWrite = %d, dataRead = %dn",
i, dataToWrite[i], dataRead[i]);
}
}
delete[] dataRead;
return 0;
}