将方法变量作为代码优化的参数传递

时间:2014-03-25 06:19:36

标签: c# design-patterns optimization

我有一个方法

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等)?

1 个答案:

答案 0 :(得分:3)

此更改不会显着提高效果。 Java和C#的垃圾收集器经过优化,可以很好地收集像wrappedLines和actualLine这样的小型短期对象。当您清除wrappedLines而不是创建一个新的时,GC仍然必须收集wrappedLines中包含的所有字符串。

除非遇到性能问题,否则不要通过猜测性能优化来使代码复杂化。如果没有额外的参数,WrapInTwoLines方法更容易理解,更不容易出错。

如果遇到性能问题,请首先查看最里面的循环 - 这是最常执行的代码。 AppendFormat需要对格式字符串进行运行时解析 - 这将比Append(“”)执行得更糟。.Append(originalLines [i])。

就工具而言,我已经获得了最好的结果,只是多次运行问题代码并计时。有更复杂的工具可用,但我没有发现它们有多大价值。总是进行多次计时试验,并将它们作为单一试验进行平均可能会有偏差。