抱歉主题模糊;很难简洁地描述我的问题。
我有大量对象(几千个)的集合,定义为...
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;
}
如果我为这些 float 字段中的每一个都提供了一个乘数,那么找到我的大型集合中哪个项目具有最大的这些 float 乘以它们的乘数的最快方法是什么。
例如,我目前有类似...
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;
}
它的性能不足,所以我想知道我是否可以提前以这种方式重组数据,以便 FindLargest 调用更快。我这样做已经有一段时间了,性能还不错,ItemsCollection 中有大约 40-50 个项目,但现在我的应用程序不同部分的设计已经改变,作为副产品,我需要处理更大的数据集(~2000ish 而不是~50ish),所以我有兴趣进一步优化它。感谢任何人可以提供的任何帮助!
编辑:我应该首先提到这个:我已经将它并行化,因为调用它的东西已经高度并行化了。而调用这个的确实是调用了很多次,有很多不同的参数,非常快。每次在我的应用程序中打开文档中的值发生变化时,这需要调用大约一百次,并且应该感觉“响应”(已经在多个后台线程上进行了所有计算,所以我不是说 UI 锁定) .
编辑 2:在已接受的答案中查看我的评论。
最佳答案
我认为问题不在于您的功能。我用不到 0.1 秒的时间完成了集合中 500,000 项的功能。
您可能想找到一种方法来优化调用此函数的代码部分。在那个级别使用 PLINQ 应该会产生更好的结果。
关于c# - C# 中的高性能乘法/求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5414263/