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

Оптимизация математических операций

28.02.2013, 10:20. Показов 3400. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо вычислять большой объем математических операций, состоящий из операций умножения и сложения комплексных чисел.

На входе имеется массив комплексных чисел array и k. Программа выполняет сложение и умножение элементов этих массивов.

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
       static void Main(string[] args)
        {
            //выделение комплексного массива данных
            Complex[] array = new Complex[256];
            Complex[] k = new Complex[256];
 
 
            //инициализация массива данных
            for (int i = 0; i < array.Length; i++)
            {
                //заполнение массива произвольными значениями
                array[i] = new Complex(2*i, i * i);
                k[i] = new Complex((float)0.5*i*i, (float)i/10);
            }
 
            Stopwatch stopWatchAll = new Stopwatch();
            stopWatchAll.Reset();
            stopWatchAll.Start();
            //КРИТИЧЕСКАЯ ПО ВРЕМЕНИ СЕКЦИЯ математических операций
            for (int i = 0; i < array.Length; i++)
            {
                //моделирование умножение
                array[i] = array[i] * k[i];
 
                //моделирование сложения
                array[i] = array[i] + k[i];
            }
            stopWatchAll.Stop();
 
            Console.WriteLine("calculation complete with time {0}", stopWatchAll.Elapsed);
 
            //вывод результата
            for (int i = 0; i < array.Length; i++)
                Console.WriteLine(array[i]);
        }
Класс Complex выглядит следующим образом:
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
 public class Complex
{
 
    public Complex(float real, float imaginary)
    {
        this.real = real;
        this.imaginary = imaginary;
    }
 
    public float Real
    {
        get { return real; }
        set { real = value; }
    }
 
    public float Imaginary
    {
        get { return imaginary; }
        set { imaginary = value; }
    }
 
 
    public static Complex operator +(Complex c1, Complex c2)
    {
        return new Complex(c1.Real + c2.Real, c1.Imaginary +
            c2.Imaginary);
    }
 
    public static Complex operator *(Complex c1, Complex c2)
    {
        return new Complex((c1.Real * c2.Real) -
        (c1.Imaginary * c2.Imaginary),
            (c1.Real * c2.Imaginary) + (c1.Imaginary *
            c2.Real));
 
    }
}
На данный момент не устраивает время расчета математических операций. Какие пути оптимизации можно применить ?


P.S.В аттаче исходники обоих классов.
Вложения
Тип файла: rar testMath.rar (2.0 Кб, 4 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2013, 10:20
Ответы с готовыми решениями:

Оптимизация I/O операций для работы с большими текстовыми файлами (1Гб+)
Доброго времени суток. Подскажите каким образом можно оптимизировать I/O операций для работы с большими текстовыми файлами (1Гб+) ...

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

Написать калькулятор, производящий 4 или 5 математических операций с тремя (или больше) дробными числами
Помогите пожалуйста написать калькулятор, производящий 4 или 5 математических операций с тремя(или больше) дробными числами. ...

21
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.02.2013, 11:42
Чем вас не устроил встроенная реализация Complex? Она и работать будет быстрее.
Прирост в 60 раз на моем компьтере, на вашем тесте.
0
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 11:44  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Чем вас не устроил встроенная реализация Complex? Она и работать будет быстрее.
В C# новичек. Мне нужно разобраться почему работает медленно и как можно ускорится.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.02.2013, 11:47
Сделать Complex структурой.
Поменять тип полей и свойств на double.
Внутри методов Complex обращаться напрямую к полям real/imaginary, а не к свойствам Real/Imaginary
1
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 11:54  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Сделать Complex структурой.
Поменять тип полей на double.
Внутри методов Complex обращаться напрямую к полям read/imaginary, а не к свойствам Real/Imaginary
Спасибо. Попробую.

Насчет встроенного Complex посмотрел, появился только в FW 4.0. У меня же MVS 2008 (доступен FW3.5 только)

Добавлено через 4 минуты
Цитата Сообщение от turbanoff Посмотреть сообщение
Поменять тип полей и свойств на double.
А как это может ускорить ?
float - 32 бита
double -64 бита.

Я же использую ОС 32 бита. Поменяв все поля и свойства на double я, как понимаю, получу еще более медленный алгоритм.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.02.2013, 11:58
Можете перетащить к себе реализацию.
mono - https://github.com/mono/mono/b... Complex.cs
MS - Нужен класс по работе с комплексными числами

Добавлено через 3 минуты
Цитата Сообщение от vekser Посмотреть сообщение
Я же использую ОС 32 бита. Поменяв все поля и свойства на double я, как понимаю, получу еще более медленный алгоритм.
double/float все равно не обрабатывается в тех битах про которые вы пишете.
расчеты либо ведутся в сопроцессоре(FPU 80-бит) либо используя SIMD операции(SSE 128/AVX 256 бит). Теоретически разницы быть не должно - можете оставить float. Тут я вам наврал.
1
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 12:25  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Внутри методов Complex обращаться напрямую к полям real/imaginary, а не к свойствам Real/Imaginary
В два раза быстрее считает. Продолжаю экспериментировать.

Добавлено через 31 секунду
Цитата Сообщение от turbanoff Посмотреть сообщение
расчеты либо ведутся в сопроцессоре(FPU 80-бит) либо используя SIMD операции(SSE 128/AVX 256 бит).
Спасибо за пояснения.

Добавлено через 13 минут
Цитата Сообщение от turbanoff Посмотреть сообщение
Сделать Complex структурой.
Увеличилось время расчета на 10%
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.02.2013, 12:32
vekser, ну и не забывайте, что весь код в классах .NET уже прекомпилирован в нативный, а код ваших методов будет скомпилирован при первом их вызове, что добавит времени в общем замере.

Перед циклом можете немного "разогреть" рантайм, вызвав операторы сложения и умножения, тогда первая итерация цикла будет использовать уже нативный код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            // Warm-up
            var warmup = array[0] * array[0] + array[0];
 
            Stopwatch stopWatchAll = new Stopwatch();
            stopWatchAll.Start();
            //КРИТИЧЕСКАЯ ПО ВРЕМЕНИ СЕКЦИЯ математических операций
            for (int i = 0; i < array.Length; i++)
            {
                //моделирование умножение
                array[i] = array[i] * k[i];
 
                //моделирование сложения
                array[i] = array[i] + k[i];
            }
            stopWatchAll.Stop();
1
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 12:36  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Перед циклом можете немного "разогреть" рантайм, вызвав операторы сложения и умножения
Спасибо. Интересный способ. Поэтому я и не стал применять встроенный Complex, иначе не разберусь с вот такими особенностями C#.


Кстати , а почему применяются структуры в родном Complex ? За счет чего они быстрее должны работать чем класс ? В моем случае структура получилась на 10% медленнее класса.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.02.2013, 12:40
Цитата Сообщение от vekser Посмотреть сообщение
почему применяются структуры в родном Complex ?
Потому что структура - это значимый тип.
Для чисел, согласитесь, подходит больше, чем класс.
Чисто семантически.

Цитата Сообщение от vekser Посмотреть сообщение
За счет чего они быстрее должны работать чем класс?
Они и не должны.

Цитата Сообщение от vekser Посмотреть сообщение
В моем случае структура получилась на 10% медленнее класса.
Потому что при каждом присваивании/изменении происходит копирование памяти.
Но в вашем случае эти 10% могут быть банальным шумом.
1
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 12:47  [ТС]
Preamp сработал лучше всего. Аж в 25 раз еще уменьшил время расчета.

Как сказать компилятору , чтобы он держал Complex уже прекомпилированным в нативный ? Preamp может и не сработать в ключевой момент.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.02.2013, 13:01
Цитата Сообщение от vekser Посмотреть сообщение
Как сказать компилятору , чтобы он держал Complex уже прекомпилированным в нативный ?
Можете прекомпилировать сборку в нативный код с помощью утилиты NGen, но в этом случае прекомпилированная сборка будет привязана к компьютеру, на котором она была сгенерирована. То есть отпадает возможность разверстки на других системах.
Возможно, есть способ генерировать нативную сборку после разверстки с использованием скрипта установщика, но я лично это не пробовал, потому точно сказать не могу.

Цитата Сообщение от vekser Посмотреть сообщение
Preamp может и не сработать в ключевой момент.
Если определенный метод был выполнен хотя бы один раз, он гарантированно будет скомпилирован в нативный код.
Потому сценарий "может и не сработать" отпадает.
0
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 14:00  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Если определенный метод был выполнен хотя бы один раз, он гарантированно будет скомпилирован в нативный код.
Потому сценарий "может и не сработать" отпадает.
В таком случае, я что-то недопонимаю.
1. Скомпилированный нативный код из метода спустя множество операций не исчезает с памяти ? Есть ли аналог сборщика мусора для нативного кода ?
2. Preamp в выше изложенном случае помог лишь скомпилировать операции + и -, которые бы все равно компилировались в цикле for? И разница времени выполнения с preamp и без равна лишь скорости компиляции и не зависит от размера цикла for ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.02.2013, 14:09
Цитата Сообщение от vekser Посмотреть сообщение
Скомпилированный нативный код из метода спустя множество операций не исчезает с памяти?
Возможно, кэшируется на диск в какой-то момент.
Это уже детали реализации рантайма.

Цитата Сообщение от vekser Посмотреть сообщение
Есть ли аналог сборщика мусора для нативного кода?
Нет, зачем?

Цитата Сообщение от vekser Посмотреть сообщение
Preamp в выше изложенном случае помог лишь скомпилировать операции + и -, которые бы все равно компилировались в цикле for?
Разумеется. Просто в примере выше эта компиляция не будет замерена таймером.


Цитата Сообщение от vekser Посмотреть сообщение
И разница времени выполнения с preamp и без равна лишь скорости компиляции и не зависит от размера цикла for?
Разумеется.
Код компилируется один раз.
1
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,178
Записей в блоге: 6
28.02.2013, 14:51
Странно, что не назвали Paraller.For - распараллелит на ядра.

Кроме того, можно задействовать ресурсы видяхи, правда, придётся попрограммировать, но если действительно важна скорость, то - - -
Три варианта:
MS Research Accelerator - требует DirectX 9.
CUDA - требует видяху от Nvidia.
MS C++ AMP - требует DirectX 11.
1
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 15:25  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Странно, что не назвали Paraller.For - распараллелит на ядра.
Я плохо знаком с C#. Спасибо попробую. Должен быть прирост,так как чисел как раз 2 Re и Im.

Кроме того, можно задействовать ресурсы видяхи, правда, придётся попрограммировать, но если действительно важна скорость, то - - -
Цель научится писать оптимально на C# и узнать тонкости. Про возможности CUDA знаком.

Добавлено через 10 минут
Цитата Сообщение от dondublon Посмотреть сообщение
Странно, что не назвали Paraller.For - распараллелит на ядра.
Опять же, фенечка FW4.0
0
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,178
Записей в блоге: 6
28.02.2013, 15:30
Цитата Сообщение от vekser Посмотреть сообщение
Я плохо знаком с C#. Спасибо попробую. Должен быть прирост,так как чисел как раз 2 Re и Im.
Оно по другому работает. Каждая итерация цикла неразрывна.

Цитата Сообщение от vekser Посмотреть сообщение
Опять же, фенечка FW4.0
Скачивается бесплатно
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
28.02.2013, 16:18
Собственно вся проблема что у вас Complex объявлен как class, а нужно чтобы был объявлен как struct.

Собственно у меня получилось что структура работает в 3 раза быстрее класса и по скорости сравнима с System.Numerics.Complex
0
1 / 1 / 0
Регистрация: 23.02.2011
Сообщений: 69
28.02.2013, 16:22  [ТС]
Цитата Сообщение от sigmov Посмотреть сообщение
Собственно вся проблема что у вас Complex объявлен как class, а нужно чтобы был объявлен как struct.

Собственно у меня получилось что структура работает в 3 раза быстрее класса и по скорости сравнима с System.Numerics.Complex
Хм...у меня же все с точностью до наоборот. Класс работает быстрее. Нужно разбираться Что - то у нас по разному сделано.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
28.02.2013, 17:04
Цитата Сообщение от vekser Посмотреть сообщение
Нужно разбираться Что - то у нас по разному сделано.
Так привидите код теста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.02.2013, 17:04
Помогаю со студенческими работами здесь

Обработать ситуацию, чтобы с пустым texbox'ом математических операций не проводилось
Добрый день! Имеются несколько textbox'ов, которые могут быть и пустыми. Есть кнопка, которая производит математические операции с...

осуществление математических операций
а можно ли осуществлять со столбцами математическме операции (или с отдельными ячейками)??? допустим есть столбец цен на товар и нужно...

Использование математических операций
&lt;? $a=4; $b=3; $x=x; $y=y; $F=$a*$x+$y*$b; { echo $F; }

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

Реализовать указатель на любую из функций математических операций
Написать четыре функции, которые + - * / два числа Указатель на ф-ю (может принять адрес любой выше указанной функции) Через указатель...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru