我有一个方法
protected List<string> WrapInTwoLines(string text, int lineLimit)
{
///There will be always two lines even first line can be empty and whole data goes to 2nd line
string[] originalLines = text.Split(new string[] { " " }, StringSplitOptions.None);
List<string> wrappedLines = new List<string>();
StringBuilder actualLine = new StringBuilder();
int index=0;
while(actualLine.Length + originalLines[index].Length < lineLimit)
{
actualLine.AppendFormat("{0} ",originalLines[index]);
index++;
}
wrappedLines.Add(actualLine.ToString());
actualLine.Clear();
while (index < originalLines.Length)
{
actualLine.AppendFormat("{0} ",originalLines[index++]);
}
wrappedLines.Add(actualLine.ToString().TrimEnd(' '));
return wrappedLines;
}
从循环内部调用
for(int i=0; i< items.Count; i++)
{
length += items[i].Length + 2;
if (length > CHAR_LENGTH)
{
var list = WrapInTwoLines(items[i], CHAR_LENGTH - (length - items[i].Length + 2));
subtitlesList.Add(s.Append(list[0]).ToString());
s = new StringBuilder().AppendFormat("{0}{1}",list[1],separator);
length = s.Length;
}
else
{
s.AppendFormat("{0}{1}", items[i], separator);
}
}
我的方法在每次迭代时使用new创建三个引用变量。我正在努力优化这段代码,并计划如下实现该方法
protected List<string> WrapInTwoLines(string[] originalLines, int lineLimit, List<string> wrappedLines, StringBuilder actualLine)
{
///There will be always two lines even first line can be empty and whole data goes to 2nd line
//string[] originalLines = text.Split(new string[] { " " }, StringSplitOptions.None);
//List<string> wrappedLines = new List<string>();
wrappedLines.Clear();
//StringBuilder actualLine = new StringBuilder();
actualLine.Clear();
//Rest remains the same
}
我认为它会改进代码,但我不确定它会改进多少,或者它是否会改进代码。我可以使用哪些工具/技术来比较内存或速度方面的代码优化? 另一个问题是,这是一个很好的模式,可以将方法变量作为参数传递(如上面的方法actualLine等)?
答案 0 :(得分:3)
此更改不会显着提高效果。 Java和C#的垃圾收集器经过优化,可以很好地收集像wrappedLines和actualLine这样的小型短期对象。当您清除wrappedLines而不是创建一个新的时,GC仍然必须收集wrappedLines中包含的所有字符串。
除非遇到性能问题,否则不要通过猜测性能优化来使代码复杂化。如果没有额外的参数,WrapInTwoLines方法更容易理解,更不容易出错。
如果遇到性能问题,请首先查看最里面的循环 - 这是最常执行的代码。 AppendFormat需要对格式字符串进行运行时解析 - 这将比Append(“”)执行得更糟。.Append(originalLines [i])。
就工具而言,我已经获得了最好的结果,只是多次运行问题代码并计时。有更复杂的工具可用,但我没有发现它们有多大价值。总是进行多次计时试验,并将它们作为单一试验进行平均可能会有偏差。