【问题标题】:Array, Dictionary or List in a session?会话中的数组、字典或列表?
【发布时间】:2011-01-13 09:14:06
【问题描述】:

在会话中存储一组值的最有效方法是什么?我猜它是列表/数组或字典。基本上,当用户从 DropDownList 中选择一个项目时,会将一个值 (between 1 and N where N <= 20) 发送回服务器。然后,我希望将此值用作会话中的索引(如果使用数组)或键(如果使用字典)。我不希望用户看到该值,因此为什么它没有存储在 DDL 中。据我所知,字典是为键查找而设计的。但是,由于规模很小,在这种情况下使用字典是否有任何开销可能会降低效率?每个对应的值对用户来说都是唯一的,所以我决定使用会话。

感谢您的建议

【问题讨论】:

  • 我们说的是多少并发用户?如果不是 1000 个,可能是微优化...
  • @Mitch - 线程安全问题在它们之间有所不同,希望有人也能指出这一点
  • 高峰时间预计会同时出现 1000-2000。通常同时有几百个。我必须用这种方法处理线程问题吗?
  • 你能提供一个你正在尝试做什么的代码示例吗?不清楚您所说的“然后我希望将此值用作会话中的索引或键”是什么意思。你在索引或散列什么?另外,“我不希望用户看到该值,因此为什么不将其存储在 DDL 中”是什么意思,意义何在?数据定义语言?那将是 RDBMS 的事情。
  • @gWiz:我没有代码访问 atm。但是,它只是用户选择项目的 DropDownList。每个项目都有一个介于 1 和 20 之间的值。假设使用一个数组,该值将成为索引 (myArray[DropDownList_value])。该数组包含自定义类型的 ID - 我不希望用户看到的 ID(因此我不只是将 ID 作为每个项目的值)。通过 DDL,我的意思是 DropDownList :)

标签: c# asp.net performance session data-structures


【解决方案1】:

几乎可以肯定是微优化,但绝对最高的性能很可能来自阵列。您最好的选择是尝试所有选项并凭经验进行验证。

【讨论】:

    【解决方案2】:

    数组将是您的最佳选择。

    如果您打算添加更多自定义类型而对代码的更改最少,则字典可能更具可扩展性。从 Dictionary 中获取项目通常是 1 跳操作。但是使用 Dictionary 所涉及的唯一开销是序列化。仅当您使用 SQLServer 或 StateServer 存储会话时才会涉及序列化。

    我做了一些基准测试,使用 BinaryFormatter 序列化一个 int、List 和 Dictionary 数组。

    我将每个对象序列化了 100000 次。 每个数据结构包含 20 个值。 结果如下:

    int[] took 1955 ms to serialize
    List<int> took 4135 ms to serialize
    Dictionary<int,int> took 27917ms to serialize
    

    所以在涉及序列化时使用字典时要小心。

    ========================================== 为了支持我的论点,即从字典中获取项目非常有效,我还做了一些基准测试,我在每个数据结构(我在上面使用过)中存储了 20 个项目,并获取了 10000000 次项目。这是结果

    int[] took 136 ms to serialize
    List<int> took 184 ms to serialize
    Dictionary<int,int> took 877 ms to serialize
    

    肯定比其他两个慢一点,但它提供了比其他两个数据结构更多的可扩展性。

    但如果是固定数量的项目,那就选择数组。在这种情况下,它们是最有效的。

    【讨论】:

    • 感谢您的回复!有没有我应该担心的线程问题?
    • 您将使用会话,因此您不必担心线程。会话提供者负责锁定。但如果您使用任何全局或静态变量,则必须小心。
    • 没有全局变量,唯一的静态变量是我的日志类。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2014-10-22
    • 2011-02-10
    相关资源
    最近更新 更多