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加载新值,而不是立即执行计算。我们还将缓存这些值,这样用户就不必一直访问数据库。
此外,如果用户希望将某些公式应用于该系列(如您的案例),则数据的大小较小。

对其进行双向编码并对其进行分析。那你肯定知道了。