Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Быстрый string


Автор: MasterOfCode 29.8.2008, 09:04
есть 2 функции, одна работает с потоком, другая с строкой. Та которая работает со строкой очень медленная, та которая с потоком, работает в 10ки раз быстрее.
строка:
Код

        public string[] Test()
        {
            //переменные
            List<string> returnStrings;
            List<List<string>> Footer;
            //...
            for (int i = 0; i < Footer[0].Length; i++)
            {
                returnStrings.Add("");
                for (int j = 0; j < Footer.Count; j++)
                {
                    returnStrings[returnStrings.Count - 1] += " " + Footer[j][i];
                }
            }
            return returnStrings.ToArray();
        }

поток:
Код

        public StreamWriter Test()
        {
            //переменные
            StreamWriter returnStrings;
            List<List<string>> Footer;
            //...
            for (int i = 0; i < Footer[0].Count; i++)
            {
                for (int j = 0; j < Footer.Count; j++)
                {
                    returnStrings.Write(" " + Footer[j][i]);
                }
                returnStrings.Write(returnStrings.NewLine);
            }
            return returnStrings;
        }


мне нужно на выходе получить string[], но чтоб работало очень быстро, желательно как с потоком. Как?

Автор: nagg 29.8.2008, 09:13
может стоит копать в сторону StringBuilder'a...

Автор: MasterOfCode 29.8.2008, 10:29
Цитата(nagg @  29.8.2008,  09:13 Найти цитируемый пост)
может стоит копать в сторону StringBuilder'a... 

скорость не сильно отличается  от первого варианта. :( и у StringBuildera как я понял размер ограниченый, а меня бывают файлы в 60 000 строк и больше, в один StringBuilder непоместятся возможно :(
Разница времени:
StringBuilder = 1364062500
List<string>(String[]) = 1279062500

видно что разница со StringBuilder работает даже медленнее....

Автор: mihryak 29.8.2008, 13:28
во-первых, твой строковый код даже не скомпилируется, зачем обманываешь?
во-вторых, покажи, как ты пробовал применить здесь билдер

Добавлено через 9 минут и 13 секунд
не разобрался с манипуляциями, но в любом случае замени
Код

                returnStrings.Add("");
                for (int j = 0; j < Footer.Count; j++)
                {
                    returnStrings[returnStrings.Count - 1] += " " + Footer[j][i];
                }

на
Код

                for (int j = 0; j < footer.Count; j++)
                {
                    returnStrings.Add(" " + Footer[j][i]);
                }

Автор: MasterOfCode 29.8.2008, 13:55
Эм... Я набивал его от руки. smile Мог и ошибиться.
Не буду заменять, т.к. мне нужно все значения выстраить в сторку через пробел! А так получится каждое значение в новой строке.

вот код со StringBuilder:

Код

            List<List<string>> Footer;
            StringBuilder sb = new StringBuilder();
            //...
             for (int i = 0; i < Footer[0].Count; i++)
            {
                sb.AppendLine("");
                for (int j = 0; j < Footer.Count; j++)
                {
                    sb.Append(" " + Footer[j][i]);
                }
            }


Добавлено через 11 минут и 21 секунду
Сорри, оказывается все тормозила моя невнимательность. У меня Footer был List<strinп[]>, а не List<List<string>. Поиск по индексу строки на порядок медленней чем по индексу контенера.
и вот в этом месте 
Код

sb.Append(" " + Footer[j][i]);

происходила утечка времени.
Как только поменял StringBilder заработал очень быстро!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)