C# 将矩阵转换为字符串对于大型矩阵来说很慢
C# converting matrix to String is slow for large matrices
我有一个 Matrix class,它提供了一种在序列化代码中使用的方法 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)
)。
知道为什么这是低效的吗?
每次添加到字符串时,它都必须创建一个新字符串并销毁速度较慢的旧字符串。使用 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
我有一个 Matrix class,它提供了一种在序列化代码中使用的方法 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)
)。
知道为什么这是低效的吗?
每次添加到字符串时,它都必须创建一个新字符串并销毁速度较慢的旧字符串。使用 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