C# 加快嵌套for循环并提高性能
我正在做一个程序,它有一个相当长的执行时间。我正在尽我所能提高绩效,但我在这方面的知识有限。有人能推荐一种加速以下方法的方法吗C# 加快嵌套for循环并提高性能,c#,performance,for-loop,C#,Performance,For Loop,我正在做一个程序,它有一个相当长的执行时间。我正在尽我所能提高绩效,但我在这方面的知识有限。有人能推荐一种加速以下方法的方法吗 public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize) { double sum = 0; for (int i = 0; i < patchSize; i++) { for (int j = 0; j &l
public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize)
{
double sum = 0;
for (int i = 0; i < patchSize; i++)
{
for (int j = 0; j < patchSize; j++)
{
sum += Math.Sqrt(Math.Pow(p1[i, j] - p2[i, j], 2));
}
}
return sum;
}
两点之间的公共静态双距离(双[,]p1,双[,]p2,int patchSize)
{
双和=0;
对于(int i=0;isqrt(x^2)
替换为abs(x)
或更快:
if(x < 0) x = -x;
这应该比你原来的方法快几倍。这个方法真的很奇怪,看起来根本不像像素之间的距离。但是你肯定会希望使用线性代数而不是直接的数组计算 图像识别、自然语言处理和机器学习算法都使用矩阵,因为当您需要批处理时,矩阵库针对此类情况进行了高度优化 在野外有过多的矩阵库,看这里 编辑:好的,感谢您的反馈,尝试改进答案 您可以使用Math.Net Numerics开放源代码库(安装
MathNet.Numerics
nuget软件包)并按如下方式重写您的方法:
using MathNet.Numerics.LinearAlgebra;
public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize)
{
var A = Matrix<double>.Build.DenseOfArray(p1).SubMatrix(0, patchSize, 0, patchSize);
var B = Matrix<double>.Build.DenseOfArray(p2).SubMatrix(0, patchSize, 0, patchSize);
return (A - B).RowAbsoluteSums().Sum();
}
使用MathNet.Numerics.linearlgebra;
两点之间的公共静态双距离(双[,]p1,双[,]p2,int patchSize)
{
var A=矩阵.构建.密集阵列(p1).子矩阵(0,patchSize,0,patchSize);
var B=矩阵.构建.密集阵列(p2).子矩阵(0,patchSize,0,patchSize);
return(A-B).RowAbsoluteSums().Sum();
}
本质上,循环会降低代码的速度。理想情况下,在进行批处理时,您应该完全避免循环。我不确定您的例程在做什么,但您是否尝试过删除
Sqrt
和Pow
操作,并改用Abs
?我没有,我现在就尝试一下。你知道循环加速的方法吗?我很确定这就是为什么执行时间如此缓慢的原因,这是一个非常奇怪的计算。你想计算什么?你能更详细地解释你的意图吗?我正在搜索和比较图像上的不同补丁。基本上,这是为了图像识别,给出传入的两个补丁(p1和p2),我计算每个像素与原始图像和比较图像的距离。(希望这是有意义的)@ConorShannon-你看起来像是sqrt a^2,实际上只是去掉了-
符号-但我看不出你所做的是如何实现计算距离的目标的(但有时我们并不总是有全局)
using MathNet.Numerics.LinearAlgebra;
public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize)
{
var A = Matrix<double>.Build.DenseOfArray(p1).SubMatrix(0, patchSize, 0, patchSize);
var B = Matrix<double>.Build.DenseOfArray(p2).SubMatrix(0, patchSize, 0, patchSize);
return (A - B).RowAbsoluteSums().Sum();
}