3

问题是我想在文件中保存一个二维浮点向量。由于我不熟悉变得麻烦的 C++,因此可能的解决方法是:

  1. 将它们序列化为字符串并写入文件。
  2. 将它们序列化为二进制数据并写入文件。

这两种方法中的哪一种在速度方面可能更有效?

我正在做类似的事情:

std::string serialized;

    for (int s = 0; s < (int) mfcc_features_a.size(); s++)
     {

     for (int t = 0; t < (int) mfcc_features_a[s].size(); t++){
       serialized = serialized + "|" + boost::lexical_cast<std::string>(mfcc_features_a[s][t]);
     }
     }

    std::cout << "serialized string is: " << serialized << std::endl;
4

3 回答 3

3

存储二进制数据可能会更快一些,因为数据几乎肯定会更小。差异可能对程序的整体性能很重要,也可能不重要:您必须进行测量才能找出答案。

在 C++03 中,您的代码效率非常低下。specialized = specialized + "|" + ...逐渐创建越来越长的完整数据副本,每个浮点值三个副本。要么使用+=,要么将数据直接写入流。在 C++11 中,您可以通过编写来解决它specialized = std::move(specialized) + "|" + ...

于 2013-04-01T06:12:02.317 回答
1

虽然二进制肯定会更快地执行,但编码和调试可能很麻烦,因为大多数程序员对浮点格式了解甚少。在这方面,整个时间编程加上执行可能会更慢。

此外,如果需要将数据移植到任何其他机器上,几乎可以肯定将其转换为通用可读格式是值得的。

于 2013-04-01T06:13:51.613 回答
0

虽然不是很 C++'ish,但我喜欢使用sprintf例程将浮点值格式化为固定宽度的字符串(24 个字符)。

char *pData = new char[vec.size() * 24 + 1];
char *p = pData;
for (size_t i = 0; i < vec.size(); ++i, p += 24)
    sprintf(p, "%+.14E\r\n", vec(i));


// ... write pData to file ...

delete[] pData;

祝你好运!

于 2013-04-01T07:34:00.387 回答