Dil*_*789 1 c# arrays performance
我有一个大型数组,其中包含大约20k个对象.每个对象都有一个大型复杂树结构中的子对象,其中也有数组.现在,应用程序只使用简单开发myObjectType[] myArray,只需13秒即可获得数组中的项目数.
是否有更好的类型或是否有更好的方法来管理阵列?99%的阵列使用是从它读取,但它目前需要将近3分钟来填充它.
编辑::添加更多信息.
该应用程序当前正在将所有这些数据加载到巨型阵列中,然后使用该阵列作为数据库.然后,它会根据您从某些下拉框中选择的内容过滤数据,并将子集返回到要显示的数据网格.我没有选择重写整个过程只是将过滤器传递给实际的数据库...
编辑:更多信息,抱歉延迟,被拉入会议.
[Serializable]
public class PartsList : System.Collections.CollectionBase
{
public virtual Part[] parts {get { return (Part[])List; } }
public new virtual int Count { get{ return this.List.Count;}}
public virtual CountryList GetCountries()
{
CountryList countries = new CountryList;
//Code removed - goes through every sub item and makes a list of unique countries...
// Yes, could have been done better.
Return countries;
}
}
Run Code Online (Sandbox Code Playgroud)
/////////////////////////////////////
[Serializable]
public class Part
{
private int id, blah, myvariable;
private CountryList countries; //formatted the same way as this class...
private YearList years;
private ModelList models;
private PriceHistoryList priceHistoryList;
// there are a couple more like these...
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么需要3分钟才能加载. - 20k零件 - 每个零件1-2个国家 - 每个零件1-10个 - 每个零件1-12个型号 - 每个零件1-10个价格历史记录
当我在这一行停止调试器时:PartsList mylist = new PartsList; //在此处填充列表if(list.Count!= 0)< - 调试器在按下f10后需要13秒才能离开此行.在列表上执行"快速监视"只会给计数值一个错误.
我真正想要的是,是否有更好的变量类型来替换数组,因为它们是内部嵌套的...
更新2010年1月29日进行 了一些搜索并且看起来由于对象设计,它一次将一个对象延迟加载到内存中,从而导致触发了一系列sql调用.此外,Count似乎花了这么长时间,因为使用CollectionBase和复杂对象的组合,它正在检索每个对象,计数然后转到下一个对象.现在计划是将应用程序移动到2008(.net 3.5从1.1)并重写应用程序的后端,以便它不会将350mb预加载到内存中......
感谢大家的投入.
20'000个物体(例如实际上是参考物)是花生.伯爵会立刻回归.如果遇到麻烦,那不是因为数组类.
最终使用哪个集合取决于您想要用它做什么.
在优化之前,请务必找到瓶颈.通常这不是人们首先想到的,因此你绝对应该使用分析器来查看实际占用的时间.
T[]任何.NET托管应用程序中的数组类型都将数组的长度存储为靠近对象开头的变量.这需要花费很少的时间来计算,所以我们需要更多关于完整结构的信息(特别是"计数"的含义)来告诉你这么长时间.
一个建议是将"节点X下的子项目总数"存储为节点的一部分.这需要O(log n)时间来维护,这与影响计数的树操作具有相同的复杂性,因此不会影响结构的算法复杂性(尽管它确实为每个节点添加了一个4字节的变量).
| 归档时间: |
|
| 查看次数: |
2989 次 |
| 最近记录: |