Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2016, 16:14   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию Специ в оптимизации загляните...

Может кто подсказать в плане оптимизации как заставить функцию 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";
            }
        }
    }
}
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 25.09.2016, 16:20   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

что сделать то надо?
брутфорсер?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.09.2016, 16:38   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Это да, просто жду может кто фич каких подскажет для оптимизации, дабы заставить побыстрее работать. Раньше как то не думал об этом, работает и ладно, а когда много выч. операций делать нужно, вопрос стал ребром. Может спалит кто плюшки в этом деле?

Ну вот из первого поста StringBilder использовать вместо string

Еще какие вещи можно использовать?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 25.09.2016, 17:19   #4
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Избавился от Form1.CheckForIllegalCrossThreadCal ls = false;, ввел делегат для обращения к контролу, но это не повлияет конечно на быстродействие никак, но с точки правильности думаю лучше с ним
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 25.09.2016, 18:29   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну быстрее разве что расспараллелить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.09.2016, 19:11   #6
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

хм, спасибо за подсказку, щас читанем это дело.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 25.09.2016, 19:58   #7
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

А вообще чисто теоритически это во много раз ускорит выч. процесс?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 25.09.2016, 20:00   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

в количество ядер, если там только вычисления, а не ввод/вывод и т.п.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 26.09.2016, 08:11   #9
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Как вы видите там только вычисление и вывод всего 1 раз, ну 2 ядра например или 4
a.n.o.n.i.m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Знатоки Shell'a загляните в тему. Norfolkrussia Помощь студентам 0 04.05.2013 17:08
Беда...кому не лень загляните..... Nikopolzhenya Общие вопросы .NET 1 04.08.2012 21:49
Опытные загляните!!! RobbaN Паскаль, Turbo Pascal, PascalABC.NET 2 24.12.2011 12:06
Ребят, кто шарит в С++ загляните... брилиант Помощь студентам 7 04.05.2011 16:31