C# 优化.NET中大系列数据的存储和处理
我这里有一个案例,我想听听专家们的意见:) 情况:C# 优化.NET中大系列数据的存储和处理,c#,.net,optimization,C#,.net,Optimization,我这里有一个案例,我想听听专家们的意见:) 情况: 我有一个数据结构,具有“Int32”和“Double”值,总共108字节 我必须处理这个数据结构的一大系列。它类似于(概念上,我将使用for循环): double result=0; foreach(系列项目) { double+=//一些基于项目的计算 } 我预计该系列的大小约为10MB 为了有用,必须对整个系列进行处理。要么全力以赴,要么一事无成 序列数据将永远不会改变 我的要求: 内存消耗不是问题。我认为现在,
- 我有一个数据结构,具有“Int32”和“Double”值,总共108字节
- 我必须处理这个数据结构的一大系列。它类似于(概念上,我将使用for循环):
double result=0;
foreach(系列项目)
{
double+=//一些基于项目的计算
}
- 我预计该系列的大小约为10MB
- 为了有用,必须对整个系列进行处理。要么全力以赴,要么一事无成
- 序列数据将永远不会改变
- 内存消耗不是问题。我认为现在,如果用户的机器上没有几十Mb的空闲空间,他可能会有更深层次的问题
- 速度是一个问题。我希望迭代尽可能快
- 没有非托管代码、互操作,甚至不安全
- 是否将项数据结构实现为值或引用类型?据我所知,值类型更便宜,但我认为如果我使用值类型,每次迭代都会为每个项目制作一个副本。此拷贝比堆访问快吗
- 如果我将访问器实现为匿名属性,有什么真正的问题吗?我相信这会增加足迹。而且getter无论如何都是内联的。我可以安全地假设这一点吗
- 我正在认真考虑直接在代码中创建一个非常大的静态只读系列数组(使用数据源很容易做到这一点)。这将给我一个10Mb的组装。有什么理由我应该避免这样吗
对其进行双向编码,并在实际输入中积极地对其进行分析。然后你就会知道哪一个更快 如果我将访问器实现为匿名属性,有什么真正的问题吗 真正的问题?没有 我相信这会增加足迹。而且getter无论如何都是内联的。我可以安全地假设这一点吗 你只能安全地假设规范保证的事情,而不是规范保证的事情 我正在认真考虑直接在代码中创建一个非常大的静态只读系列数组(使用数据源很容易做到这一点)。这将给我一个10Mb的组装。有什么理由我应该避免这样吗 我想你可能太担心这个了 如果我的回答似乎不屑一顾,我很抱歉。你要求互联网上随机的人推测两件事中哪一件更快。我们可以猜测,我们可能是对的,但你可以在眨眼之间用两种方式编码,并确切地知道哪一种更快。那么,就这么做吧 然而,我总是首先为正确性、可读性和可维护性编写代码。我预先制定了合理的性能要求,并查看我的实现是否满足这些要求。如果是这样,我就继续前进。如果我需要从应用程序中获得更高的性能,我会对其进行分析,找出瓶颈,然后开始担心
您正在询问一个需要~10000000/108~=100000次迭代的琐碎计算。这甚至是应用程序中的瓶颈吗?说真的,你想得太多了。只需编写代码,然后继续。这是100000个循环,CPU时间就是全部。不要再想它了,只要写代码就行了。你在小题大做 速度是主观的。如何加载数据以及进程中其他位置有多少数据?如果不需要复杂的解析逻辑来创建结构,那么加载数据将是应用程序中最慢的部分 我认为你问这个问题是因为你有一个108字节大小的结构,你可以对它进行计算,你想知道为什么你的应用程序很慢。请注意,结构是按值传递的,这意味着如果在计算期间将结构传递给一个或多个方法,或者从列表中获取结构,则每次都将创建结构的副本。这确实是非常昂贵的
将结构更改为类并仅公开getter,以确保只有只读对象。这将解决您的性能问题 一个好的做法是将数据与代码分开,因此对于“嵌入代码问题中的大数组”,我建议不要这样做。
使用LINQ对整个系列进行计算;速度很快。
如果需要更多功能,请为每个点使用节点类 我曾经处理过如此大量的数据。它们是在图表上绘制的点。最初,每毫秒或更短时间服用一次。数据集非常庞大。用户希望对这些系列应用不同的公式,并将其显示出来。在我看来,你的问题可能与此类似 为了提高速度,我们将点的不同缩放级别存储在db中。说每毫秒,然后聚合每分钟、每小时、每天等(用户需要的任何内容)。当用户放大或缩小时,我们将从db加载新值,而不是立即执行计算。我们还将缓存这些值,这样用户就不必一直访问数据库。
此外,如果用户希望将某些公式应用于该系列(如您的案例),则数据的大小较小。对其进行双向编码并对其进行分析。那你肯定知道了。