【问题标题】:Linq penalty to performance when doing a cast inside在内部进行强制转换时,Linq 对性能的影响
【发布时间】:2016-05-10 17:49:57
【问题描述】:

我有一个这样的 linq 语句:

products = products.OrderBy(p => Convert.ToDateTime(p.ExpirationDate)).ToList();

其中ExpirationDatestring 类型,表示产品的到期日期。无论如何,这不是我的设计决定。

为了完成排序,我需要将 ExpirationDate 的字符串表示形式转换为 DateTime 以便排序正常工作。

主要是我想知道是否有人知道在 LINQ 查询中强制转换(通过 Convert.ToDateTime)对性能的影响?如果有的话?

【问题讨论】:

  • 不能简单测量一下吗?如果您甚至没有尝试过它对您来说是否足够快,为什么还要关心性能?
  • 相比什么?
  • 我认为没有问题,这就是 LINQ 要做的事情,转换、映射、转换等,这就是你使用 lambdas 的原因。这实际上取决于上下文以及您期望操作完成的速度
  • 这不是强制转换。那是一种转换。差异是相关的。

标签: c# performance linq


【解决方案1】:

虽然我不确定这个问题的令人满意的答案是什么样的,但我确实测量了使用 linq 将简单包装器排序为日期时间和字符串的性能。

Average Ticks Per Run
DWrapper: 1078.5965
SWrapper: 4060.6365

如您所见,对我来说,使用演员表的平均时间是不使用演员表的四倍。也就是说,没有理由去告诉任何人这比任何其他方式慢四倍,因为我的包装器非常轻量级,这将对这里看到的结果产生很大影响,更不用说这种类型的其他问题了绩效衡量。

注意事项:

  • 使用 System.Diagnostics.Stopwatch 完成时间测量。
  • 测试是在运行 chrome、Visual Studio 和其他大型应用程序的嘈杂机器上运行的。
  • 测试在两个具有相同随机日期的 2,000 大小的列表上运行了 10,000 多次。
  • DateTime 对象的字符串表示是通过 DateTime.ToLongDateString 方法完成的。
  • 包装类包含单个 DateTime 或字符串。
  • 在发布模式下编译的测试代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多