是否有任何意义使用Any()linq表达式进行优化?

时间:2011-09-28 14:26:34

标签: asp.net-mvc linq optimization

我有一个MVC应用程序,它从2个控制器方法返回2种类型的Json响应; AnyRemindersExist()和GetAllUserReminders()。第一个返回一个布尔值,第二个返回一个数组,两者都包装为Json。

我有一个JavaScript计时器检查针对用户的日历提醒。它进行第一次调用(AnyRemindersExist)以检查是否存在提醒以及客户端是否应该进行第二次调用。

例如,如果来自Any()查询的Json响应的结果为false,则它不会进行第二个控制器操作,从而进行LINQ选择调用。如果存在提醒,则会进一步提出请求(使用LINQ SELECT)。

想象一个系统在100-1000s用户使用系统的情况下逐渐增加,在客户端上,每隔30-60秒就会有一个请求加载到提醒中。这个Any()调用是否有助于减少服务器上的负载?

5 个答案:

答案 0 :(得分:2)

如果你总是之后会获得实际值,那么没有 - 拥有更少的请求更有意义,并且总是给出完整的结果。我非常怀疑返回没有结果比返回没有结果的指示慢。

编辑:tvanfosson的最新评论(撰写本文时)值得推广:

  

你真的只能通过测量来判断,我只会求助于IFF,仅选择选项的性能不符合要求。

这是关于性能的最重要的事情:猜测的值远远小于测试数据的值。

答案 1 :(得分:1)

Any仅检查Collection中是否至少有一个项目正在返回。使用Count > 0之类的东西来计算集合中的项目总数,然后是更好的。

如果您的AnyRemindersExist方法按照类似的原则运行,那么不再调用服务器会减少您的负载。

答案 2 :(得分:1)

我想说这取决于底层查询的翻译方式。如果any调用被转换为索引查找时select(可能是由于连接获取相关数据)必须进行某种表扫描,那么它将节省一些工作没有提醒被发现。当有提醒时,它会引起一些额外的工作。如果大多数调用不会导致任何结果,那么它可能会很有用。

在一般情况下,我只会选择数据,并且只尝试优化IF,结果证明速度不够快。实际上在服务器上节省工作量的条件非常狭窄,可能只适用于手工制作SQL而不是依赖于ORM。

答案 3 :(得分:0)

所以你问的是,如果不做工作,应用程序不需要这样做会减少服务器上的工作量吗?

当然。如何回答“是的,无缘无故地做额外工作不会影响服务器负载”。

答案 4 :(得分:0)

最终取决于Any检查与获得结果的速度和错误的频率。

  • 如果Any来电与select接近,那么它很漂亮 从来没有任何意义。

  • 如果Any来电比select要快得多,那么90% 时间它是真正的,那么它可能是不值得的(最好的情况是你 得到10%的改善,最坏的情况是实际上更多的工作)。

  • 如果Any来电比select和90%快得多 时间是错误,那么检查是否有意义 是在实际获得结果之前的任何一个。

所以答案取决于你的具体情况。最终,您将需要测量相对性能(在不同的典型负载上,可能某些查询比其他查询更密集)以及没有结果返回的频率。

实际上在这种情况下检查Any几乎没有意义。

  • 如果Any返回false,则您无需获取结果。 然而,这意味着它无论如何都不会返回结果,所以 除非您的Any支票明显快于select 返回0结果,这里没有额外的好处。

  • 另一方面,如果Any返回true,那么你需要得到 无论如何,结果是Any完全是额外的工作。