【问题标题】:Efficent C# sorted collection of fixed number of mutable objects固定数量可变对象的高效 C# 排序集合
【发布时间】:2013-04-22 16:43:18
【问题描述】:

我正在尝试考虑有效的方法来维护小型固定有限数量的对象(几十个)的集合,这些对象会非常频繁地变化(至少每秒几次到每秒几十次)。 是否存在具有更新现有插入项的键(排名)功能的现有排序集合?

让我们考虑以下项目定义:

public class Item
{
    public decimal Ranking { get; private set; }
    public IIdentity Identity { get; private set; }
    public IOtherInfo OtherInfo { get; private set; }
}

我将收到这些项目的传入流(通常会更新排名,有时会使之前的排名无效 - 例如可以通过将排名设置为 0 或无限来简化)。 Identity 值的变化很少(并且可以快速转换为索引 0 到 N),OtherInfo 可以更改(但可以轻松存储在单独的查找数组中),最重要的是 Ranking 将快速更改. 我在考虑 SortedCollection,但是每当排名变化(这很常见)听起来效率低下时,都需要删除和阅读项目。

任何允许更新项目及其在收藏中使用的收藏建议将不胜感激。

【问题讨论】:

  • 哈希集未排序。
  • 鉴于项目的数量非常小(几十个项目不算什么)我非常怀疑它是否重要。即使是糟糕的数据结构也不会对这么小的数据集造成问题。最重要的是,每秒更新几十次内容不是很多。您仍然需要数百毫秒才能进行更新。这应该只需要几十 纳秒。即使实现平庸,您也可能每秒执行数百次更新。
  • @Vladimir Schmidt 见这里:stackoverflow.com/questions/1552225/…
  • SortedDictionary 怎么样?
  • Hash Set 将只包含数据并提供良好的性能能力来添加和删除操作,因此使用 OrderBy (linq) 它带来了获得所需内容的最佳方式,不是吗?

标签: c# performance sorting collections


【解决方案1】:

对于您报告的负载,我想说您应该使用一种数据结构,该结构本身具有更好的可维护性,而不是担心挤出几个额外的 CPU 周期。使用SortedListSortedSet,只在遇到不可接受的结果时才担心提高性能。

我会说这是premature optimization is the root of all evil 的情况之一。

【讨论】:

  • 这是绝对有效的观点。我仍然没有可靠的数字。但是强烈预计这将是一个弱点。我的应用程序中会有数百个这样的结构,并且会有(N x 数百个)相应的并发数据流(通过本地千兆链路流式传输)
  • 应用程序的其余部分将非常简单(消耗数据)并且不需要同步。然而,这些结构会消耗来自这些多个线程的数据。想想例如关于来自多个来源的股票价格的聚合。我应该在我的问题中提到这一点,但我不想添加分散注意力的细节
  • 您需要这些集合是线程安全的这一事实非常重要,您提到的其他几点表明,还应该考虑一些架构决策。 . 我建议要么重新工作,要么(可能更好)创建一个新问题来包含这些要点
  • 另外,作为一项建议,如果您的应用程序的这一特定方面对任务非常关键,以至于您已经希望从中获得更多性能,那么您应该 尽快对其性能进行基准测试。
  • 很公平。听起来我应该从最简单的代码开始,即使它看起来效率低下。然后在 perf 之后返回它。测量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
相关资源
最近更新 更多