Как можно уменьшить время алгоритма?

310
28 августа 2021, 00:40

Считываю текстовый файл, обрабатываю его и записываю в другой файл. Но работает это медленно.

Как можно оптимизировать работу даного кода что бы работало быстрее?

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();
Answer 1

Если файл маленький - попробуй считывать весь файл целиком и после обработки записывать целиком. Вместо постоянных считываний и записи по каждому чиху.

Винчестер работает медленно. И ему приходится обращатся то к одной области памяти то к другой. Вот и все задержки алгоритма.

Если файлы большие(гигабайт там или больше) - считывай и обрабатывай через буфер данных. То есть используй BufferedStream и подбери оптимальный размер буфера экспериментальным путем. Предлагаю начать с мегабайт 15ти.

Это и есть главная причина задержки.

Так же используй StringBuilder вместо String для сохранения результатов обработки данных с файла, как сказал iluxa1810

Это для оптимизации использования оперативной памяти в первую очередь. На быстродействие влияет значительно меньше чем первый пункт, но так же важно.

Answer 2

Если файл большой, то использование переменной string не допустимо, так как каждое новое присвоение создается новый объект string с копированием всех предыдущих данных.

Для этих целей лучше использовать StringBuilder.

READ ALSO
Пропуск катсцены(сделанной с помощью Timeline)

Пропуск катсцены(сделанной с помощью Timeline)

Сразу после загрузки сцены начинает проигрываться катсцена,сделанная с помощью TimelineПотом геймплей, если игрок умирает сцена просто загружается...

156
Receive игнорирует сообщения с data[0]

Receive игнорирует сообщения с data[0]

Задача интегрироваться в систему где для связи между устройствами используется протокол tcpНужно разработать сервер, для другой логики работы...

97
C#. Как в Windows Form изображение сделать круглым

C#. Как в Windows Form изображение сделать круглым

Создавая программу, мне понадобилось создать picture Box, который для моего дизайна должен быть круглымПомогите понять, как это сделать

104