Считываю текстовый файл, обрабатываю его и записываю в другой файл. Но работает это медленно.
Как можно оптимизировать работу даного кода что бы работало быстрее?
StreamWriter sw = new StreamWriter("output.txt");
StreamReader tr = new StreamReader("input.txt");
var stack = new Stack<string>();
string line = "";
while (!tr.EndOfStream)
{
line += tr.ReadLine()+" ";
}
tr.Close();
string[] file_notes = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
for(int i = 1; i < file_notes.Length; i++)
{
if (file_notes[i] == "+") stack.Push(file_notes[i + 1]);
else if (file_notes[i] == "-") sw.WriteLine(stack.Pop());
}
sw.Close();
Если файл маленький - попробуй считывать весь файл целиком и после обработки записывать целиком. Вместо постоянных считываний и записи по каждому чиху.
Винчестер работает медленно. И ему приходится обращатся то к одной области памяти то к другой. Вот и все задержки алгоритма.
Если файлы большие(гигабайт там или больше) - считывай и обрабатывай через буфер данных.
То есть используй BufferedStream и подбери оптимальный размер буфера экспериментальным путем. Предлагаю начать с мегабайт 15ти.
Это и есть главная причина задержки.
Так же используй StringBuilder вместо String для сохранения результатов обработки данных с файла, как сказал iluxa1810
Это для оптимизации использования оперативной памяти в первую очередь. На быстродействие влияет значительно меньше чем первый пункт, но так же важно.
Если файл большой, то использование переменной string не допустимо, так как каждое новое присвоение создается новый объект string с копированием всех предыдущих данных.
Для этих целей лучше использовать StringBuilder.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей