【问题标题】:C# converting matrix to String is slow for large matrices对于大型矩阵,C# 将矩阵转换为字符串很慢
【发布时间】:2018-02-10 21:48:00
【问题描述】:

我有一个 Matrix 类,它提供了一个用于序列化代码的方法 ToString()

public override string ToString()                           
// Function returns matrix as a string
// e.g. "Rows=3,Columns=3,Data= 1.00 0.50 0.75 | 0.50 1.00 0.25 | 0.75 0.25 1.00 |"
{
    string s = "Rows=" + rows.ToString() + ",Columns=" + cols.ToString() + ",Data= ";
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++) s += String.Format("{0:G17}", mat[i, j]) + " ";
        s += "| ";
    }
    return s;
}

我的用例是一个包含 10,000 多行和 2 列的矩阵。执行大约需要 10 秒,这太慢了。有没有更有效的方法来做到这一点?注意我需要完整的双精度序列化。

感觉代码效率低下,因为我反序列化时的反向操作需要不到一秒钟(这在循环中使用Convert.ToDouble(string))。

任何想法为什么这是低效的?

【问题讨论】:

标签: c# serialization tostring


【解决方案1】:

每次你添加到一个字符串时,它都必须创建一个新的并销毁旧的,这很慢。使用 StringBuilder 代替它只会添加到字符串构建器而不是创建一个新的。

{
    StringBuilder s = new StringBuilder("Rows=" + rows.ToString() + ",Columns=" + cols.ToString() + ",Data= ");
    for (int i = 0; i < rows; i++)
     {
         for (int j = 0; j < cols; j++) s.AppendFormat("{0:G17}", mat[i, j]) + " ");
        s.Append( "| ");
   }
    return s.ToString();
}

https://docs.microsoft.com/en-us/dotnet/standard/base-types/stringbuilder

【讨论】:

  • s.AppendFormat("{0:G17}", mat[i, j]) + " "); 看起来很奇怪,甚至无法编译。可能更好的是s.AppendFormat("{0:G17} ", mat[i, j]);
  • 谢谢Ken,这完美解决了速度问题。我不知道 StringBuilder 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
相关资源
最近更新 更多