Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
1

Надо улучшить скорость выполнения кода (формирование длинной строки)

23.02.2012, 13:20. Показов 1190. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть метод который возвращает случайное слово:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static string RandomWord(int Number) 
{
/*  RandomWord causing it returns a random word consisting 
    of letters specified in the call, for example RandomWord(56); 
    return the word consisting of 56 random letters. */
            
    Random RandomIndex = new Random(); //Create an object RandomIndex, we will serve it to pull out a random array      ArrayLetter letter.
            string[] ArrayLetter = {"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "a", "s", "d", "f", "g", 
                    "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m"}; //Array hammered ArrayLetter letters on the two layouts.
            
    string OutputValue = null; //OutputName used to store ready-made speech, but until it is empty.
            for (int i = 0; i < Number; i++)
            {
            /*  In a series of random letters pulled out of the array and stored in ArrayLetter OutputName 
            as many times as was specified when calling RandomWord.*/
 
                string ElementArray = ArrayLetter[RandomIndex.Next(0, 25)]; //In a random letter written ElementArray fished array ArrayLetter.
                OutputValue += ElementArray; //In the words of OutputName obtained by adding the letters received from the variable ElementArray.
            }
            return OutputValue; //No comments.
}
Ну и для проверки вывожу его в консоли:

C#
1
2
3
4
5
public static void Main(string[] args)
{
    Console.WriteLine(RandomWord(99999));
    Console.ReadLine();
}
Так вот, этот кусок кода выполняется секунд 15-25, при этом, на моей машине, нагло поедает 4 МБ ОЗУ и 50% мощности ядра. Как улучшить метод?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2012, 13:20
Ответы с готовыми решениями:

Максимально сократить скорость выполнения кода
Привет всем, есть такой код: (Выполняет скачивание строк с хешкодом/путем до файла, получает...

Как отследить скорость выполнения кода в приложении
Всем привет. Есть проект, клиент говорит что одна из операций занимает много времени, но судя по...

Почему плавает скорость выполнения кода?
Здравствуйте, заметил такое дело. Имеем часть кода Где pg-это List&lt;Page&gt;(параметры страницы для...

Скорость выполнения кода
Началось все с одной несложной задачки - https://www.cyberforum.ru/haskell/thread1821507.html Я...

7
773 / 553 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
23.02.2012, 14:52 2
Лучший ответ Сообщение было отмечено как решение

Решение

Думаю сэкономить можно на массиве с символами ,а использовать вместо него числовые коды char

C#
1
2
3
4
5
6
7
8
9
10
11
12
int u = Environment.TickCount;
            Random r = new Random();
            int Number=9999999;
            StringBuilder sb =new  StringBuilder(Number);
            for (int i = 0; i < Number; i++)
            {
                sb.Append((char)r.Next(97, 122));
                
            }
            
            this.Text= (Environment.TickCount-u).ToString();
            MessageBox.Show(sb.ToString());
Добавлено через 37 минут
Строку длинной в 10 миллионов знаков формирует за 0.3 сек .
Если это же число подставить в вашу функцию то можно идти спать

Добавлено через 4 минуты
Цитата Сообщение от CycleFunction Посмотреть сообщение
Так вот, этот кусок кода выполняется секунд 15-25, при этом, на моей машине, нагло поедает 4 МБ ОЗУ и 50% мощности ядра

Не по теме:

К сожалению IQ компа не передаётся его владельцу :jokingly:

4
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
23.02.2012, 15:00  [ТС] 3
Спасибо, все работает, но у меня теперь другой вопрос.
Вывожу я значит RandomWord(10) в консоль в цикле, а он повторяет несколько слов, и даже чаще чем всегда в первой строке одно слово, а в остальных другое. Поэксперементировав с выводом я понял что значение меняется через определенный промижуток времени, поэтому я думаю дело в том что он пытается вывести новое значение когда оно еще не созданно и поэтому выводит старое. Как можно это исправить?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Trening_589
{
    class Program
    {
        public static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                System.Console.WriteLine(RandomWord(10));
            }
            System.Console.ReadLine();
        }
        
        public static string RandomWord(int Number)
        {
            System.Random Rand = new System.Random();
            System.Text.StringBuilder StringBuilder = new System.Text.StringBuilder(Number);
            for (int i = 0; i < Number; i++)
                StringBuilder.Append((char)Rand.Next(97, 122));
            return(StringBuilder.ToString());
        }
    }
}
Результат:
Миниатюры
Надо улучшить скорость выполнения кода (формирование длинной строки)  
0
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
23.02.2012, 15:07 4
А если так:
C#
1
System.Random Rand = new System.Random((int) DateTime.Now.Ticks & 0x0000FFFF)
2
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
23.02.2012, 15:11  [ТС] 5
Исключение из-за этой строки.
System.OverflowException: Переполнение в результате выполнения арифметической операции.
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
23.02.2012, 15:12 6
C#
1
System.Random Rand = new System.Random();
должен создаваться 1 раз глобально с параметрами DateTime.Now.Ticks, тогда не будет повторов
2
773 / 553 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
23.02.2012, 15:18 7
верно изменить до такого
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  public static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
        {
 
            System.Console.WriteLine(RandomWord(10)); 
            
        }
        System.Console.ReadLine();
    }
    static System.Random Rand = new System.Random((int)DateTime.Now.Ticks & 0x0000FFFF);
    public static string RandomWord(int Number)
    {
 
        System.Text.StringBuilder StringBuilder = new System.Text.StringBuilder(Number); 
        for (int i = 0; i < Number; i++)
            StringBuilder.Append((char)Rand.Next(97, 122));
        return (StringBuilder.ToString());
    }
1
11 / 11 / 1
Регистрация: 25.01.2012
Сообщений: 103
23.02.2012, 15:30  [ТС] 8
Всем спасибо!
0
23.02.2012, 15:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2012, 15:30
Помогаю со студенческими работами здесь

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

Деление длинной строки кода
здравствуйте, есть такая строка кода: $(this).html('&lt;div id=&quot;contactable_inner&quot;&gt;&lt;/div&gt;&lt;form...

Скорость рисования элементов в чертеже Solidworks во время выполнения кода C#
Я написала код в Visual Studio для SolidWorks 2012, который выполняет создание чертежа на...

Переделать функцию поиска самой длинной строки так, чтобы она правильно печатала размер произвольно длинной входной строки и воспроизводила ее
Переделать головную функцию поиска самой длинной строки так, чтобы она правильно печатала ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru