C++ 尝试优化每一帧将数据打印到二进制文件
C++ Attempt to optimize printing data to binary file for every frame
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;
}
相关文章:
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- C++ 尝试优化每一帧将数据打印到二进制文件
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 当我在每一帧中多次使用正则表达式时,FPS 下降了
- 为什么除了最后一帧之外,每一帧都没有调用命令
- 使用标准库或Boost库从一组数据中计算直方图
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- boost asio async_receive_from()在连续发送帧时缺少udp帧数据检索
- WinApi 在每一帧中绘制
- 如何在返回一次数据后从类实例中删除数据
- 如何根据一组规则/条件检查一组数据以进行分类
- 如何预先分配LibavCodec的内存来编写解码的帧数据
- Opencv 视频帧.我只能看到最后一帧
- 寻求使用 FFmpeg 在 mp4 容器中 h264 编解码器的视频帧.数据包 pts 始终为 0
- 访问视频的每一帧并对其进行处理
- Qt:显示实时视频,一次一帧
- c++我需要将文件中的数据读取到多维数组中,然后用一种数据类型对数组进行排序.怎样