Оптимизация математических операций - C#
Формулировка задачи:
Необходимо вычислять большой объем математических операций, состоящий из операций умножения и сложения комплексных чисел.
На входе имеется массив комплексных чисел array и k. Программа выполняет сложение и умножение элементов этих массивов.
Класс Complex выглядит следующим образом:
На данный момент не устраивает время расчета математических операций. Какие пути оптимизации можно применить ?
P.S.В аттаче исходники обоих классов.
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]);
} 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));
}
}Решение задачи: «Оптимизация математических операций»
textual
Листинг программы
// 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();