Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
CycleFunction
10 / 10 / 1
Регистрация: 25.01.2012
Сообщений: 103
1

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

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

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

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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2012, 13:20
Ответы с готовыми решениями:

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

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

Формирование низкоуровневого кода (компиляция кода на С из текстового файла)
Доброго времени суток, форумчане. Необходима информация о трансляции Си (без...

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

Оценить скорость (время) выполнения метода
Нельзя ли никак сию задачу решить? То есть к примеру, написал я метод,...

7
Vitall
756 / 536 / 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
CycleFunction
10 / 10 / 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
Миниатюры
Надо улучшить скорость выполнения кода (формирование длинной строки)  
serg42
115 / 97 / 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
CycleFunction
10 / 10 / 1
Регистрация: 25.01.2012
Сообщений: 103
23.02.2012, 15:11  [ТС] 5
Исключение из-за этой строки.
System.OverflowException: Переполнение в результате выполнения арифметической операции.
0
m0nax
1203 / 908 / 109
Регистрация: 12.01.2010
Сообщений: 1,891
Завершенные тесты: 3
23.02.2012, 15:12 6
C#
1
System.Random Rand = new System.Random();
должен создаваться 1 раз глобально с параметрами DateTime.Now.Ticks, тогда не будет повторов
2
Vitall
756 / 536 / 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
CycleFunction
10 / 10 / 1
Регистрация: 25.01.2012
Сообщений: 103
23.02.2012, 15:30  [ТС] 8
Всем спасибо!
0
23.02.2012, 15:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2012, 15:30

Мультипоточность. Скорость выполнения не зависит от количества потоков
Всем привет! В общем есть такая проблемка - делаю в своем приложении...

Scheme - скорость выполнения кода
Началось все с одной несложной задачки -...

Почему плавает скорость выполнения кода?
Здравствуйте, заметил такое дело. Имеем часть кода Где pg-это...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru