Cha*_*vig 3 c# performance transform matrix multiplication
对不起,模糊的主题标题; 很难简洁地描述我的问题.
我收集了大量的对象(几千个),定义为......
public class Item
{
public int ID;
public float A;
public float B;
public float C;
public float D;
public float E;
public float F;
public float G;
}
Run Code Online (Sandbox Code Playgroud)
如果我为这些浮点字段中的每一个赋予了乘数,那么找到我的大集合中哪个项目中最大的那些浮点数乘以它们的乘数的最快方法是什么.
例如,我现在有类似......
public Item FindLargest(float aMult, float bMult, float cMult, float dMult, float eMult, float fMult, float gMult)
{
Item largest = null;
float largestTotal = 0f;
foreach(Item item in ItemsCollection)
{
float total = item.A * aMult +
item.B * bMult +
item.C * cMult +
item.D * dMult +
item.E * eMult +
item.F * fMult +
item.G * gMult;
if (total > largestTotal)
{
largest = item;
largestTotal = total;
}
}
return largest;
}
Run Code Online (Sandbox Code Playgroud)
这种性能缺乏,所以我想知道我是否可以提前以这种方式重组数据,以便FindLargest调用快得多.我已经这样做了一段时间,性能很好,在ItemsCollection中有~40-50项,但现在我的应用程序的不同部分的设计已经改变,作为副产品,我需要处理更大的数据集(~2000ish而不是~50ish),所以我有兴趣进一步优化它.感谢任何人都能提供的帮助!
编辑:我应该首先提到这一点:我已经将其并行化了,因为调用它已经被大量并行化了.什么叫做这个确实很多次,很快就用很多不同的参数调用它.每次我的应用程序中的打开文档中的值发生更改时,都需要调用大约一百次,并且应该感觉"响应"(已经在多个后台线程上进行所有计算,所以我不是指UI锁定) .
编辑2:在接受的答案中查看我的评论.
一种选择是使用PLINQ来使用多个内核.
var result = (from item in ItemsCollection
let total = item.A * aMult +
item.B * bMult +
item.C * cMult +
item.D * dMult +
item.E * eMult +
item.F * fMult +
item.G * gMult
select new {item, total}).AsParallel().Max(i => i.total);
Run Code Online (Sandbox Code Playgroud)
我认为问题不在于你的功能.我花了不到0.1秒的时间来完成该系列中500,000个项目的功能.
您可能希望找到一种方法来优化调用此函数的代码部分.在该级别使用PLINQ应该会产生更好的结果.