#string #vb.net #loops #for-loop
#строка #vb.net #циклы #for-loop
Вопрос:
У меня есть 3 текстовых поля. 1-е и 2-е текстовые поля содержат примерно от 40.000 до 80.000 строк данных. Каждая строка содержит максимум 6-7 символов. Последний флажок содержит 800-1000 строк данных. Эти строки также содержат 6-7 символов. Чтобы сохранить все эти данные в одном текстовом файле, я сначала добавляю временную метку в начале каждой строки, после табуляции записывается первая строка текстового поля, затем второй tbox и третий tbox, а затем новая строка. Это продолжается так.
Я использую 3 флажка, чтобы понять, какие текстовые поля пользователь хочет сохранить. После нажатия кнопки save запускается этот цикл ниже. Но это занимает так много времени. Даже если пользователь выбирает для сохранения только первое текстовое поле, что означает, скажем, 50.000 строк, это занимает почти минуту!
Я пробовал такие методы, как запись в строку, с помощью StringBuilder, с циклами do-while и т.д., но не смог добиться существенного эффекта. Я искал в Интернете и на форумах о различных методах, но не мог найти способ.
Есть ли какой-нибудь эффективный способ заставить его работать быстрее?
For i = 0 To linesCount - 1
textStr.Append(timeCount amp; vbTab)
If (cbSaveOutput.Checked And Not tbOutput.Text = "") Then textStr.Append(tbOutput.Lines(i) amp; vbTab)
If (cbSaveForce.Checked And Not tbForce.Text = "") Then textStr.Append(tbForce.Lines(i) amp; vbTab)
If (cbSaveCrop.Checked And Not tbCroppedData.Text = "" And i < tbCroppedData.Lines.Length) Then textStr.Append(tbCroppedData.Lines(i))
textStr.Append(Environment.NewLine)
timeCount = Math.Round(timeCount (1 / tbSampleRate.Text), 6)
ProgressBar1.Increment(1)
Next
Ответ №1:
Основная проблема заключается в том, что вы используете Lines
свойство снова и снова. Lines
это не «живые» данные. Когда вы получите значение свойства, элемент управления сначала получит значение Text
свойства, а затем разделит его на новый массив. Вы делаете это для каждой строки в каждом TextBox
и дважды для третьей TextBox
. Это, очевидно, плохо. Как вы ВСЕГДА должны делать при использовании Lines
свойства, получите его один и только один раз и присвоите значение переменной, а затем используйте эту переменную снова и снова. Есть и другие улучшения, которые вы могли бы внести в этот код, но это основная проблема, которая значительно сократит время.
Комментарии:
1. О боже, спасибо тебе… Я разделил все текстовые поля на массивы, а также использовал целое число для строк. Длина и сделал тест с 20.000-25.000 строк. Это занимало более 2 минут, теперь это заняло 10 секунд! В 12 раз быстрее. Спасибо!