C# ASP.NET会话-大对象与许多小对象

C# ASP.NET会话-大对象与许多小对象,c#,asp.net,performance,session,C#,Asp.net,Performance,Session,我有一个场景可以优化我的web应用程序在会话中存储数据和检索数据的方式。我应该指出,我正在使用SQL Server作为会话存储 我的场景是,我需要在用户会话中存储映射到字符串值的唯一ID列表,以供以后使用。我继承的当前代码正在使用一个带有自定义对象的列表,但我已经看到某种字典的性能要好得多 我已经测试了两个备选方案: 在会话中存储词典。当我需要取回字符串时,我会从会话中获取一次字典,并可以测试字典对象上的每个ID 由于会话本身基本上类似于字典,因此使用唯一的会话键直接将字符串存储在会话中,例如s

我有一个场景可以优化我的web应用程序在会话中存储数据和检索数据的方式。我应该指出,我正在使用SQL Server作为会话存储

我的场景是,我需要在用户会话中存储映射到字符串值的唯一ID列表,以供以后使用。我继承的当前代码正在使用一个带有自定义对象的
列表
,但我已经看到某种字典的性能要好得多

我已经测试了两个备选方案:

  • 在会话中存储
    词典
    。当我需要取回字符串时,我会从会话中获取一次字典,并可以测试字典对象上的每个ID

  • 由于会话本身基本上类似于字典,因此使用唯一的会话键直接将字符串存储在会话中,例如
    session[“MyString_”]=stringValue”
    。从会话中获取值基本上是相反的操作

  • 根据我需要执行的操作和使用100个字符串,我的测试结果显示了以下内容:

    • 字典-4552字节,操作时间为0.1071秒
    • 会话直接-4441字节,执行操作的时间为0.0845秒
    从这些结果中,我看到我在会话中节省了一些空间(可能是因为我没有序列化字典对象的开销),而且从会话中获取值时似乎更快,可能是因为字符串反序列化比对象更快


    因此,我的问题是,在会话中存储大量较小的对象是否比存储一个较大的对象对性能更有利?存储大量较小的对象与存储一个我没有见过的较大的对象相比,是否存在一些缺点?

    序列化和搜索较大对象会受到惩罚(由于需要表示更复杂的结构,它们占用更多的空间和处理器时间)

    当你只能进行一次搜索时,为什么还要进行两次搜索呢


    此外,所有涉及缓存/存储解决方案的文档都提到,基于计算键从列表中序列化单个值比存储所有字典并检索并在其中搜索要高效得多。

    我认为您已经回答了自己的问题,表明是的,存在开销使用反序列化对象,但我认为真正的原因应该是可管理性和可维护性

    当您谈论100个对象时,存储差异的大小将是最小的,但是当您将其扩展到1000个对象时,差异也会增加,特别是当您使用复杂的自定义对象时。如果您有一个应用程序,其中有许多用户都使用1000个会话,那么您可以想象这是多么的困难阿拉布尔

    此外,由于有许多会话对象,您无疑需要编写更多的代码来处理每个不同的对象。这可能不是很多,但肯定更多。这也可能会使开发人员更难理解您的代码,从而扩展您的代码


    如果您可以以IEnumerable或IDictionary等单一的基本格式处理会话,那么我认为这是最好的,即使涉及到一些开销。

    您是否有指向您所指文档的链接?我有兴趣阅读@linkerro的不同观点,很有意思!我认为有一个始终在可维护性和性能之间进行权衡。在我的情况下,从会话中获取这些值是在备份属性中处理的,因此任何人都不应该直接访问会话,也不应该知道会话是如何完成的,我认为这对我的情况来说是可以的。但我感谢您的意见。