Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19

Как максимально ускорить программу в MVS?

06.06.2018, 21:53. Показов 2346. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа с кучей массивов и циклов, выполняется 30 секунд, нужно 10-. Какие есть способы встроенной оптимизации по времени в visual studio ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.06.2018, 21:53
Ответы с готовыми решениями:

Как ускорить программу сканера IP адрессов
Написал программу с 4-мя циклами которая посылает на IP адресса запросы (начиная от 0.0.0.1 до 255.255.255.255) и если ответ от сервера...

Как максимально ускорить Windows7?
Здравствуйте!Подскажите пожалуйста: Мне нужно чтобы Windows загружался максимально быстро на нетбуке,по сути на нем будет запускаться...

Как ускорить программу?
Задача: найти в строке такую подстроку максимальной длины, чтобы символы в ней не повторялись. Принцип решения: пусть дана строка s, в...

23
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
07.06.2018, 02:01
Qiwnin, для .NET? По сути их нет, если не считать конфигурацию release. Следует сконцентироваться на алгоритмических улучшениях.
0
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
07.06.2018, 19:27  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Qiwnin, для .NET? По сути их нет, если не считать конфигурацию release. Следует сконцентироваться на алгоритмических улучшениях.
OwenGlendower, Когда ставлю в сборке "Оптимизировать код", то программа ускоряется с 28 до 25 секунд
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
07.06.2018, 19:29
Qiwnin, прекрасно. Именно эту опцию я имел и виду. В release конфигурации она включена как раз.
0
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
07.06.2018, 19:32  [ТС]
OwenGlendower, такой вопрос, цикл^6 сравнивает массивы^4 типа long. Если уменьшить цикл до ^3, не изменив общее кол-во переборов в них, массивы сжать до квадратных, опять таки не изменив кол-во элементов, и заменить тип long на int, программа станет работать быстрее хотя бы на 20% ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
07.06.2018, 19:34
Qiwnin, не знаю. Возьми и проверь.
0
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
07.06.2018, 19:38  [ТС]
OwenGlendower, придется, раз другого выхода нет. Кстати, векторизация циклов автоматически же производится ? У меня он довольно простой, только глубокий
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
07.06.2018, 19:48
Цитата Сообщение от Qiwnin Посмотреть сообщение
Кстати, векторизация циклов автоматически же производится ?
Скорее нет чем да. Нужно проверять с помошью окна ассемблер что сгенерировал JIT-компилятор.
1
09.06.2018, 08:17

Не по теме:

Qiwnin, Мне кажется, что 25 секунд это очень много, скинь, пожалуйста, код программы.

0
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
09.06.2018, 09:10  [ТС]
MaksSmag, вот
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
for (int w1 = 0; w1 <= 51; w1++)
            {
                for (int w2 = w1 + 1; w2 <= 51; w2++)
                {
                    for (int w8 = w1; w8 <= 51; w8++)
                    {
                        for (int w9 = w8 + 1; w9 <= 51; w9++)
                        {
                            for (int w6 = 0; w6 <= 51; w6++)
                            {
                                for (int w7 = w6 + 1; w7 <= 51; w7++)
                                {
                                    if (Hstr1[w1,w2,w6,w7] == 0 | Hstr1[w8,w9,w6,w7] == 0)
                                    {
                                        continue;
                                    }
                                    if (Hstr1[w1, w2, w6, w7] > Hstr1[w8, w9, w6, w7])
                                    {
                                        mC[w1, w2, w8, w9]++;
                                    }
                                    else if (Hstr1[w1, w2, w6, w7] < Hstr1[w8, w9, w6, w7])
                                    {
                                        mC[w8, w9, w1, w2]++;
                                    }
                                    else
                                    {
                                        mC[w1, w2, w8, w9]+=0.5;
                                        mC[w8, w9, w1, w2]+=0.5;
                                    }
                                }
                            }
                        }
                    }
                }
            }
0
09.06.2018, 10:46

Не по теме:

Qiwnin, А можно полный код, пожалуйста?

0
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
09.06.2018, 12:28  [ТС]
MaksSmag, полный код слишком большой. Именно этот момент тормозит всю прогу, потому что переборов около 1.2*10^9, плюс еще разветвление условий, а проц грузится только на 26%
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
09.06.2018, 13:01
Цитата Сообщение от Qiwnin Посмотреть сообщение
а проц грузится только на 26%
1 поток, 4 ядра=25%.
Вполне вероятно что можно распараллелить на все ядра....
0
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
09.06.2018, 15:15  [ТС]
Someone007, согласен, вот только как это здесь можно осуществить, непонятно
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
09.06.2018, 15:50
Лучший ответ Сообщение было отмечено Qiwnin как решение

Решение

Qiwnin, откладывая пока многопоточность в сторону, попробуй вот такой вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
for (int w1 = 0; w1 <= 51; w1++)
{
    for (int w2 = w1 + 1; w2 <= 51; w2++)
    {
        for (int w8 = w1; w8 <= 51; w8++)
        {
            for (int w9 = w8 + 1; w9 <= 51; w9++)
            {
                for (int w6 = 0; w6 <= 51; w6++)
                {
                    for (int w7 = w6 + 1; w7 <= 51; w7++)
                    {
                        var x = Hstr1[w1, w2, w6, w7];
                        var y = Hstr1[w8, w9, w6, w7];
                        if (x == 0 || y == 0)
                        {
                            continue;
                        }
                        if (x > y)
                        {
                            mC[w1, w2, w8, w9]++;
                        }
                        else if (x < y)
                        {
                            mC[w8, w9, w1, w2]++;
                        }
                        else
                        {
                            mC[w1, w2, w8, w9]+=0.5;
                            mC[w8, w9, w1, w2]+=0.5;
                        }
                    }
                }
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
09.06.2018, 16:20  [ТС]
OwenGlendower, ускорило на 8 секунд. Протестировал ваш вариант, было 22, свой - 30. Почему-то мой стал опять 30 секунд выполняться, видимо оптимизацию не настроил

Добавлено через 6 минут
OwenGlendower, задумку я понял, ваш вариант на треть быстрее, спасибо. Больше не получится сжать ?

Добавлено через 9 минут
OwenGlendower, перезагрузил пк, уже за 16 секунд цикл прогнал
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18282 / 14205 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
09.06.2018, 16:22
Лучший ответ Сообщение было отмечено Qiwnin как решение

Решение

Цитата Сообщение от Qiwnin Посмотреть сообщение
Больше не получится сжать ?
Можно использовать локальные ref переменные из C# 7
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
for (int w1 = 0; w1 <= 51; w1++)
{
    for (int w2 = w1 + 1; w2 <= 51; w2++)
    {
        for (int w8 = w1; w8 <= 51; w8++)
        {
            for (int w9 = w8 + 1; w9 <= 51; w9++)
            {
                ref double mC1 = ref mC[w1, w2, w8, w9];
                ref double mC2 = ref mC[w8, w9, w1, w2];
                for (int w6 = 0; w6 <= 51; w6++)
                {
                    for (int w7 = w6 + 1; w7 <= 51; w7++)
                    {
                        var x = Hstr1[w1, w2, w6, w7];
                        var y = Hstr1[w8, w9, w6, w7];
                        if (x == 0 || y == 0)
                        {
                            continue;
                        }
                        if (x > y)
                        {
                            mC[w1, w2, w8, w9]++;
                        }
                        else if (x < y)
                        {
                            mC[w8, w9, w1, w2]++;
                        }
                        else
                        {
                            mC1+=0.5;
                            mC2+=0.5;
                        }
                    }
                }
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 07.05.2017
Сообщений: 19
09.06.2018, 16:51  [ТС]
OwenGlendower, заменил оставшиеся mC[] на mC1 и mC2, цикл стал за 13 секунд пробегать. Что удивительно, mC2 по факту не влияет на результат вычислений, убрал ее, а на скорость не повлияло, даже пол секунды откуда-то накинуло
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
10.06.2018, 17:06
А вот и многопоточность подвезли:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
            Parallel.For(fromInclusive: 0, toExclusive: 52, body: (w1) =>
            {
                for (int w2 = w1 + 1; w2 <= 51; w2++)
                {
                    for (int w8 = w1; w8 <= 51; w8++)
                    {
                        for (int w9 = w8 + 1; w9 <= 51; w9++)
                        {
                            for (int w6 = 0; w6 <= 51; w6++)
                            {
                                for (int w7 = w6 + 1; w7 <= 51; w7++)
                                {
                                    if (Hstr1[w1,w2,w6,w7] == 0 | Hstr1[w8,w9,w6,w7] == 0)
                                    {
                                        continue;
                                    }
                                    if (Hstr1[w1, w2, w6, w7] > Hstr1[w8, w9, w6, w7])
                                    {
                                        //lock (locker)
                                        //{
                                        //    mC[w1, w2, w8, w9]++;
                                        //}
 
                                        InterlockedEx.Add(ref mC[w1, w2, w8, w9], 1);
                                    }
                                    else if (Hstr1[w1, w2, w6, w7] < Hstr1[w8, w9, w6, w7])
                                    {
                                        //lock (locker)
                                        //{
                                        //    mC[w8, w9, w1, w2]++;
                                        //}
 
                                        InterlockedEx.Add(ref mC[w8, w9, w1, w2], 1);
                                    }
                                    else
                                    {
                                        //lock (locker)
                                        //{
                                        //    mC[w1, w2, w8, w9] += 0.5;
                                        //    mC[w8, w9, w1, w2] += 0.5;
                                        //}
 
                                        InterlockedEx.Add(ref mC[w1, w2, w8, w9], 0.5);
                                        InterlockedEx.Add(ref mC[w8, w9, w1, w2], 0.5);
                                    }
                                }
                            }
                        }
                    }
                }
            });
 
 
 
        public static class InterlockedEx
        {
            //[MethodImpl(MethodImplOptions.AggressiveInlining)]
            public static double Add(ref double location1, double value)
            {
                Thread.MemoryBarrier();
                double snapshot = location1;
                double snapshot2;
                double result;
                do
                {
                    result = snapshot + value;
                    snapshot2 = Interlocked.CompareExchange(ref location1, result, snapshot);
                    if (snapshot2 == snapshot)
                    {
                        return result;
                    }
                    else
                    {
                        snapshot = snapshot2;
                        //Thread.SpinWait(300);
                    }
                } while (true);
            }
        }
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
10.06.2018, 17:27
Qiwnin,
Замена double[,,,] на double[][][][] даcт прирост скорости примерно в два раза (на Release).
А если еще кешировать подмассивы во внешних циклах, то и больше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2018, 17:27
Помогаю со студенческими работами здесь

Как ускорить программу?
Здравствуйте, такая задача: Страна состоит из n городов, которые расположены на оси. Координата i-го из городов равна xi. Выведите...

Как ускорить программу?
m=int(input()) for i in range(1,10**18): if (i)&lt;m and m&lt;=(i ** 2 + i)//2: a=(((i ** 2 + i)//2)) print (a) ...

Как ускорить программу?
Доброго времени суток! Появилось немного свободного времени, решил повспоминать haskell зашел на codewars выбрал задачу. Задача...

Как ускорить программу?
n, m = input().split() team,word = , points = *int(n) for i in range(int(m)): team, word = input().split() ...

Как ускорить готовую программу?
Доброго времени суток уважаемые форумчане. Я решил задачу ,но при сдаче исходного кода мне пишет ,что долго выполняется программа....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru