.NET 4.x Как заставить функцию работать быстрее? - C#
Формулировка задачи:
Может кто подсказать в плане оптимизации как заставить функцию Check() работать быстрее? Применил StringBilder вместо string, код стал работать в 3 раза быстрее. Может кто еще каких идей подкинет?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using System.Diagnostics; using System.IO; namespace PA_Hard { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Enabled = false; Form1.CheckForIllegalCrossThreadCalls = false; } static bool flag = true; string alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; int length_pass = 1; StringBuilder pass = new StringBuilder(); public void Check() { ulong number_of_combinations = 0; Stopwatch st = new Stopwatch(); st.Start(); while (flag) { StringBuilder result = new StringBuilder(); int[] index = new int[length_pass]; bool finish = true; while (finish) { number_of_combinations++; for (int i = 0; i < index.Length; i++) { result.Append(alphabet[index[i]]); } if (result.Equals(pass)) { flag = false; st.Stop(); richTextBox1.Text = "Пароль " + result + "\nПодобран с " + number_of_combinations.ToString() + " комбинации\nВремя затрачено " + st.Elapsed.TotalSeconds.ToString(); break; } result.Clear(); index[index.Length - 1]++; for (int i = (index.Length - 1); i >= 0; i--) { if (index[i] > (alphabet.Length - 1)) { index[i] = 0; if (--i < 0) { finish = false; break; } index[i]++; i++; } } } length_pass++; } flag = true; length_pass = 1; number_of_combinations = 0; } private void button1_Click(object sender, EventArgs e) { Thread ChechThread = new Thread(Check); ChechThread.IsBackground = true; ChechThread.Start(); } private void textBox1_TextChanged(object sender, EventArgs e)//Проверочка на корректный ввод { int i = 0; try { if (textBox1.Text[i] != null)// Попробую вызвать исключение с индексом { i++; } } catch (IndexOutOfRangeException) { //break; //ничего не ввели в поле } if (i > 0) { i = 0; pass.Clear(); while (true) { try { if ((Convert.ToInt32(textBox1.Text[i]) >= 48 && Convert.ToInt32(textBox1.Text[i]) <= 57) || (Convert.ToInt32(textBox1.Text[i]) >= 65 && Convert.ToInt32(textBox1.Text[i]) <= 90) || (Convert.ToInt32(textBox1.Text[i]) >= 97 && Convert.ToInt32(textBox1.Text[i]) <= 122)) { button1.Enabled = true; pass.Append(textBox1.Text[i]); richTextBox1.Text = "Пароль задан верно\n"; } else { button1.Enabled = false; richTextBox1.Text = "Присутстуют неккоректные символы\n"; break; } i++; } catch (IndexOutOfRangeException) { break; } } } else { button1.Enabled = false; richTextBox1.Text = "Введите хотя бы один символ\n"; } } } }
форум умер.
Решение задачи: «.NET 4.x Как заставить функцию работать быстрее?»
textual
Листинг программы
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { string alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; StringBuilder pass = new StringBuilder(); public Form1() { InitializeComponent(); } private async void button1_Click(object sender, EventArgs e) { var context = SynchronizationContext.Current; await Task.Run(() => Check(context)); } public void Check(SynchronizationContext context) { Stopwatch st = new Stopwatch(); st.Start(); int LEN_ABC = alphabet.Length - 1; int combinationsCounter = 0; int passLength = 0; Parallel.For(1, 100, new ParallelOptions {MaxDegreeOfParallelism = 3} , (_p, loopState) => { StringBuilder result = new StringBuilder(); int length_pass = Interlocked.Increment(ref passLength); int[] index = new int[length_pass]; int LEN = length_pass - 1; while (!loopState.IsStopped) { int combination = Interlocked.Increment(ref combinationsCounter); for (int i = 0; i < length_pass; i++) { result.Append(alphabet[index[i]]); } if (result.Equals(pass)) { st.Stop(); context.Post((_) => { mainLabel.Text = "Пароль " + result + "\nПодобран с " + combination + " комбинации\nВремя затрачено " + st.Elapsed.TotalSeconds.ToString(); }, null); loopState.Stop(); break; } result.Clear(); index[LEN]++; for (int i = LEN; i > 0; i--) { if (index[i] > LEN_ABC) { index[i] = 0; index[i - 1]++; } } // if (index[0] > LEN_ABC) { index[0] = 0; break; } } }); } private void textBox1_TextChanged(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(textBox1.Text)) { button1.Enabled = false; mainLabel.Text = "Введите хотя бы один символ\n"; return; } pass.Clear(); for (int i = 0; i < textBox1.Text.Length; i++) { int Num = Convert.ToInt32(textBox1.Text[i]); if ((Num > 47 && Num < 58) || // Цифры (Num > 64 && Num < 91) || // Прописные (Num > 96 && Num < 123)) // Строчные { button1.Enabled = true; pass.Append(textBox1.Text[i]); mainLabel.Text = "Пароль задан верно\n"; } else { button1.Enabled = false; mainLabel.Text = "Присутстуют неккоректные символы\n"; break; } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д