如何使 C++ 代码更快:使用 CFile 从相机数据创建 .csv 文件
How to make C++ code faster: Creating .csv file from camera data using CFile
一个高层次的概述是 'CFile 文件的 'file.write()' 方法被调用用于每个单独的整数数据值(第 9 行)以及第 12 行,我在其中写了一个逗号到文件。
这意味着对于 327,680 个输入数据整数,有 2*327,680 = 655,360 次 file.write() 调用。因此,代码非常慢,因此,代码需要 3 秒才能创建一个 csv 文件。我怎样才能提高代码的效率?
注意:我无法更改代码的任何声明。我必须使用 CFile。此外,pSrc 的类型为 uint_16_t,并且包含我要存储在 .csv 文件中的数据。数据范围为 0 - 3000 整数值。
1 CFile file;
2 int mWidth = 512;
3 int mHeight = 640;
4 UINT i = 0;
5 char buf[80];
6 UINT sz = mHeight * mWidth; //sz = 327,680
7 while (i < sz) {
8 sprintf_s(buf, sizeof(buf), "%d", pSrc[i]);
9 file.Write(buf, strlen(buf));
10 i++;
11 if (i < sz)
12 file.Write(",", 1);
13 if (i % mWidth == 0)
14 file.Write("\r\n", 2);
15 }
所有值都输出到 640x512 .csv 文件中,其中包含表示摄氏度的整数。
试试这个怎么样
使用整行大小的字符串
然后在每次迭代时将您的数据添加到 buf 和一个逗号(通过将整行连接到 buf)以及当您到达
if (i % mWidth == 0)
将整行写入 CFile 并使用
清除 buf
像这样
UINT sz = mHeight * mWidth; std::string line = "";
while (int i < sz) { line += std::to_string(pSrc[i])) + ','; i++;
if (i % mWidth == 0) {
file.Write(line.c_str(), line.size());
file.Write("\r\n", 2);
line = ""; } }
刚想通了!下面是似乎完成工作的实现。
int sz = mHeight * mWidth;
std::string uniqueCSV = "Frame " + to_string(miCurrentCSVImage + 1) + ".csv";
std::string file = capFile + "/" + uniqueCSV;
std::ofstream out;
out.open(file);
std::string data = "";
int i = 0;
while (i < sz) {
data += to_string(pSrc[i]);
i++;
if (i < sz)
data += ",";
if (i % mWidth == 0)
data += "\n";
}
out << data;
out.close();
miCurrentCSVImage++;
一个高层次的概述是 'CFile 文件的 'file.write()' 方法被调用用于每个单独的整数数据值(第 9 行)以及第 12 行,我在其中写了一个逗号到文件。
这意味着对于 327,680 个输入数据整数,有 2*327,680 = 655,360 次 file.write() 调用。因此,代码非常慢,因此,代码需要 3 秒才能创建一个 csv 文件。我怎样才能提高代码的效率?
注意:我无法更改代码的任何声明。我必须使用 CFile。此外,pSrc 的类型为 uint_16_t,并且包含我要存储在 .csv 文件中的数据。数据范围为 0 - 3000 整数值。
1 CFile file;
2 int mWidth = 512;
3 int mHeight = 640;
4 UINT i = 0;
5 char buf[80];
6 UINT sz = mHeight * mWidth; //sz = 327,680
7 while (i < sz) {
8 sprintf_s(buf, sizeof(buf), "%d", pSrc[i]);
9 file.Write(buf, strlen(buf));
10 i++;
11 if (i < sz)
12 file.Write(",", 1);
13 if (i % mWidth == 0)
14 file.Write("\r\n", 2);
15 }
所有值都输出到 640x512 .csv 文件中,其中包含表示摄氏度的整数。
试试这个怎么样 使用整行大小的字符串
然后在每次迭代时将您的数据添加到 buf 和一个逗号(通过将整行连接到 buf)以及当您到达
if (i % mWidth == 0)
将整行写入 CFile 并使用
清除 buf像这样
UINT sz = mHeight * mWidth; std::string line = "";
while (int i < sz) { line += std::to_string(pSrc[i])) + ','; i++;
if (i % mWidth == 0) {
file.Write(line.c_str(), line.size());
file.Write("\r\n", 2);
line = ""; } }
刚想通了!下面是似乎完成工作的实现。
int sz = mHeight * mWidth;
std::string uniqueCSV = "Frame " + to_string(miCurrentCSVImage + 1) + ".csv";
std::string file = capFile + "/" + uniqueCSV;
std::ofstream out;
out.open(file);
std::string data = "";
int i = 0;
while (i < sz) {
data += to_string(pSrc[i]);
i++;
if (i < sz)
data += ",";
if (i % mWidth == 0)
data += "\n";
}
out << data;
out.close();
miCurrentCSVImage++;