Просто измените url на http://localhost
вместо localhost
. Если вы откроете файл html из локального, вы должны создать локальный сервер для работы с этим html-файлом, самый простой способ - Web Server for Chrome
. Это устранит проблему.
Вы можете использовать векторы в пространстве имен System.Numerics
. Предостережение заключается в том, что он будет работать только с float
, а не с double
. Это не должно быть проблемой для вычитания:
float[] array1 = new float[] { 1.1F, 2.0F, 3.0F, 4.0F, 5.0F };
float[] array2 = new float[] { 6.1F, 7.0F, 8.0F };
float[,] final_array = new float[array1.Length, array2.Length];
int vectorCount = array2.Length / 4;
Vector4[] array2Vectors = new Vector4[vectorCount];
Parallel.For(0, vectorCount, i =>
{
int offset = i * 4;
array2Vectors[i] = new Vector4(array2[offset], array2[offset + 1],
array2[offset + 2], array2[offset + 3]);
});
Parallel.For(0, array1.Length, i =>
{
Vector4 v1 = new Vector4(array1[i], array1[i], array1[i], array1[i]);
for (int j = 0; j < array2Vectors.Length; j++)
{
Vector4 result = Vector4.Abs(Vector4.Subtract(v1, array2Vectors[j]));
int offset = j * 4;
final_array[i, offset] = result.X;
final_array[i, offset + 1] = result.Y;
final_array[i, offset + 2] = result.Z;
final_array[i, offset + 3] = result.W;
}
for (int j = vectorCount * 4; j < array2.Length; j++)
{
final_array[i,j] = Math.Abs(array1[i] - array2[j]);
}
});
Поскольку вы сейчас используете векторы, вы будете использовать SIMD-инструкции ЦПУ, которые должны ускорить вашу задачу.
Дополнительный прирост производительности достигается за счет параллельного выполнения с Parallel.For
, в котором используются все доступные ядра ЦП.
Нет способа сделать это быстрее с точки зрения алгоритмической сложности. Для вычисления этого результата требуется ровно O(n * m)
операций, хотя бы потому, что у вас есть результирующий массив этого размера.
Есть несколько способов немного улучшить производительность самого кода.
Самый простой - переключиться на зубчатые массивы, как уже предлагалось в комментариях:
double[] array1 = new double [] { 1.1, 2.0, 3.0, 4.0, 5.0 };
double[] array2 = new double[] { 6.1, 7.0, 8.0};
double[][] final_array = new double[5][];
for (int i = 0; i < 5; i++)
{
final_array[i] = new double[3];
for (int j = 0; j < 3; j++)
{
final_array[i][j] = Math.Abs(array1[i] - array2[j]);
}
}
Подробнее о многомерных массивах и зубчатых массивах и их производительности можно узнать здесь:
Каковы различия между многомерным массивом и массивом массивов в C #?
Вы также можете пойти дальше и повысить производительность, используя небезопасные указатели для доступа к многомерному массиву или используя расширенные инструкции процессора (встроенные) , но ... вопрос в том: это действительно то, что вам нужно думать? Это единственное горлышко бутылки в системе с чрезвычайно высокой нагрузкой? Если это не так, просто оставьте свой код в том виде, в котором он есть, в четко читаемой и понятной форме. Говоря о производительности, O(n * m)
асимптотическая сложность отлично подходит для массивов размером 15000.