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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2010, 01:25   #1
WoWan-SM
 
Регистрация: 27.04.2010
Сообщений: 3
По умолчанию Оптимизация кода

Консольное приложение. Писалось на VS 2010 с использованием .NET Framework 4.

Вроде более-менее оптимизировал, но все равно генерация таблиц при переборе значения seed от 0 до 1 000 000 занимает 71 секунду и выходной файл весит под 700 метров.

Задача: уменьшит время генерации для 1 000 000 таблиц и уменьшить размер выходного файла.

Код:
using System;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace GenerateSeed
{
    class Program
    {
       public static int[] results = new int[210];
       public static int[] TTable = new int[210];
       public static int[] Table = new int[210];
       public static Int64 rand_pos;
       public static int A;

       public static void Main()
        {
           //на экран
            Console.WriteLine("Начата генерация таблиц. Ждите");

           //Счетчик
            DateTime dt = DateTime.Now;

           //Поток на запись
            StreamWriter SW = new StreamWriter(@"C:\1.txt", true);

           //Цикл заполнения таблицы
            Parallel.For(0, 208, i =>
            {
                TTable[i] = i;
            });

           //Цикл генерации таблиц
            for (int j = 0; j != 1000000; j++)
            {
                //вызываем функцию
                Table = GenerateTable(j);
                //запись в файл
                SW.WriteLine(Table.ToString());
            };

           //Закрываем запись в файл
            SW.Close();

           //считаем затраченное время
            TimeSpan sp = DateTime.Now - dt;
           //На экран
            Console.WriteLine("Генерация закончена");
            Console.WriteLine("Время генерации 1кк таблиц: " + sp + " сек");
            Console.ReadLine();
        }


       public static int[] GenerateTable(Int64 seed)
        {
           //Используем Parrallel.For доступную только в 4 фрейморвке, для расспределения нагрузок между процессорами
            Parallel.For(2, 209, i =>
                {
                    seed=((seed)*214013+2531011) & 4294967295;
                    rand_pos = (((seed >> 16) & 32767) % i)+1;
                    A = TTable[rand_pos];
                    Table[rand_pos] = Table[i];
                    Table[i] = A;
                });

            Parallel.For(0, 210, (i, loopState) =>
            {
                if (Table[i]==19)
                {
                    Table[i]=Table[19];
                    Table[19]=19;
                    loopState.Break();
                }
            });

            Parallel.For(1, 209, i =>
            {
                results[i - 1] = Table[i];
            });
            return results;
        }

    }
}
WoWan-SM вне форума Ответить с цитированием
Старый 27.04.2010, 07:49   #2
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Чтобы чтото оптимизировать, определитись с местом которое оптимизировать(поставте несколько отрезков времени) и оптимизируйте самый тяжелый участок...
По поводу задания(именно задание, что вы нужно сделать то?): нужно создать 1кк случайных записей?
dampirik вне форума Ответить с цитированием
Старый 27.04.2010, 07:55   #3
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Из прошлой темки....
Как видно самое тяжелое это запись...
Код:
string time="";
string path="data.txt";
DateTime dt=DateTime.Now;
string s[] = new string[30000000];
for(int i=0;i<s.Length;i++)
{
s[i]="dasdasdafsfsdfds";
}
time="Создание массива: ";
time+=(DateTime.Now-dt).ToString()+"\n";
DateTime cr= DateTime.Now;
using(StreamWriter sw= File.CreateText(path))
{
for(int i=0;i<s.Length;i++)
{
sw.WriteLine(s[i]);
}
}
time+="Запись  массива: ";
time+=(DateTime.Now-cr).ToString();
this.label1.Text=time;
Результаты:
Создание массива: 00:00:00.2430196
Запись массива: 00:00:03.9493975
dampirik вне форума Ответить с цитированием
Старый 27.04.2010, 08:49   #4
WoWan-SM
 
Регистрация: 27.04.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от dampirik Посмотреть сообщение
Чтобы чтото оптимизировать, определитись с местом которое оптимизировать(поставте несколько отрезков времени) и оптимизируйте самый тяжелый участок...
По поводу задания(именно задание, что вы нужно сделать то?): нужно создать 1кк случайных записей?
Задание написано выше Не меняя основного алгоритма, ускорить время заполнения строками текстового файла и уменьшить его объем.

Первую оптимизацию мне подсказали: это писать в буфер памяти, а из него кусками записывать в файл.
WoWan-SM вне форума Ответить с цитированием
Старый 27.04.2010, 11:33   #5
WoWan-SM
 
Регистрация: 27.04.2010
Сообщений: 3
По умолчанию

Нашел косяк в своем коде, он у меня тупо строки выводил "System.Int32[]". Добавли кодирование base64 (чтобы потом я мог работать с этим файлом достаточно декодировать). Время выполнения уменьшилось на 10 секунд (у меня общее время выполнения занимает 55 секунд). Объем выходного текстового файла уменьшился в 3 раза (268,5 Мбайт). Надо еще урезать где-то.

Код:
using System;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace GenerateSeed
{
    class Program
    {
       public static byte[] results = new byte[210];
       public static byte[] TTable = new byte[210];
       public static byte[] Table = new byte[210];
       public static int rand_pos;
       public static int A;
        public static string s;

       public static void Main()
        {
            Console.WriteLine("Начата генерация таблиц. Ждите");

            DateTime dt = DateTime.Now;

            StreamWriter SWq = new StreamWriter(@"C:\1.txt", true);

            Parallel.For(0, 208, i =>
            {
                TTable[i] = (byte)i;
            });

            for (int j = 0; j != 1000000; j++)
            {
                Table =GenerateTable(j);
                //Кодируем строку чтобы меньше занимала
                s = Convert.ToBase64String(Table);
                SWq.WriteLine(s);
            };

            SWq.Close();

            TimeSpan sp = DateTime.Now - dt;
            Console.WriteLine("Генерация закончена");
            Console.WriteLine("Время генерации 1кк таблиц: " + sp + " сек");
            Console.ReadLine();
        }


       public static byte[] GenerateTable(Int64 seed)
        {

            Parallel.For(2, 209, i =>
                {
                    seed=((seed)*214013+2531011) & 4294967295;
                    rand_pos = (int)(((seed >> 16) & 32767) % i)+1;
                    A = TTable[rand_pos];
                    Table[rand_pos] = Table[i];
                    Table[i] = (byte)A;
                });

            Parallel.For(0, 210, (i, loopState) =>
            {
                if (Table[i]==19)
                {
                    Table[i]=Table[19];
                    Table[19]=19;
                    loopState.Break();
                }
            });

            Parallel.For(1, 209, i =>
            {
                results[i - 1] = Table[i];
            });
            return results;
        }

    }
}
WoWan-SM вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода. Alex Cones Общие вопросы Delphi 19 12.10.2009 20:51
Оптимизация кода в си dampirik Помощь студентам 4 07.07.2009 11:30
Оптимизация кода Terran Общие вопросы Delphi 6 01.11.2008 16:57
Оптимизация кода [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 20.08.2008 15:00
Оптимизация кода. MAKTECYMA Общие вопросы C/C++ 2 05.06.2008 16:48