【问题标题】:.NET 3.5 optimizations after converting from 2.0 to 3.5从 2.0 转换到 3.5 后的 .NET 3.5 优化
【发布时间】:2009-06-19 02:50:41
【问题描述】:

我将我们的项目从 .NET 2.0 转换为 3.5,并正在寻找可以利用 3.5 框架完成的优化。我可以用 3.5 做些什么,就像在数据结构中一样。除了 LINQ to SQL 之外,还有使用 DataAccess 的任何建议。 任何建议/指针都会很棒。我不是在看任何具体的优化,只是一般的 .我也在使用 VB.NET :(

【问题讨论】:

  • 最大的优化就是切换到 C#。

标签: .net vb.net optimization .net-3.5


【解决方案1】:

这有点依赖于 C#,因为您不能在 VB.Net 中编写迭代器。但对我来说,一个很大的性能改进是迭代器 + 扩展方法 + lambda 表达式组合。 .Net 2.0 中也提供了迭代器,但是当您将它们与 IEnumerable 扩展方法结合使用时,您会突然拥有一个非常强大的优化工具。

例如,假设您有代码读取文件并获取包含某些特定文本的所有行。在 .Net 2.0 中,您可以使用 File.ReadAllLines 或遍历流阅读器。在 .Net 3.5 中,您可以使用迭代器包装流阅读器并编写如下代码:

ReadLines(@"C:\MyFile.txt").Where(l => l.Contains("search text") );

现在这并不是那么特别,因为您可以在 .Net 2.0 中编写接近它的代码。但真正酷的是你可以继续添加过滤器:

var query = ReadLines(@"C:\MyFile.txt")
                            .Where(l => l.Contains("search text") )
                            .Select(l => int.Parse(l.SubStrin(5,8))
                            .Where(i => i > 10 );

int sum=0;
foreach (int value in query) 
{
    sum += value;
}

小测验——该代码将迭代文件结果多少次?答案正是一个。添加新的.Where().Select() 不会导致它再次循环结果。相反,它推迟执行以为您的枚举创建一种管道。

要在 .Net 2.0 中获得类似的性能,您必须编写一个更长的函数,包括打开和读取文件,拥有一个更复杂的类来实现 IEnumerable,或者广泛使用最常见的自定义委托程序员不会理解的。

这允许您以一种非常简单且非常可重用的方式抽象出读取文件的代码,从而使该语言现在适合编写高效的代码。有趣的部分是您可以从 VB.Net 中使用它:您只需要在某个地方有一个 C# 程序集来保存您想要编写的迭代器,然后您的 VB.Net 代码就会看起来像这样:

Dim query = ReadLines("C:\MyFile.txt") _
                      .Where(Function(l) l.Contains("search text") ) _
                      .Select(Function(l) Integer.Parse(l.SubString(5,8) ) _
                      .Where(Function(i) i > 10 )

Dim sum As Integer = 0
For Each value As Integer In query
    sum += value
Next value

【讨论】:

    【解决方案2】:

    我不完全确定您所说的优化是什么意思。能说清楚一点吗?

    3.5 框架和相应的 VB.Net 编译器与其说是关于优化,不如说是关于 LINQ(语言集成查询)的概念。这是一种定义通用查询语言的方法,有点类似于 SQL,可用于各种不同的来源。

    例如,假设您有一个学生列表,并且想要获取具有特定名称的学生。在 LINQ 之前,您会编写如下内容

    Dim list As New List<Student>()
    For Each cur in col
      if cur.Name = SomeName Then
        list.Add(cur)
      End If
    Next
    

    LINQ 让您编写以下代码,从而大大简化了这一过程

    Dim result = From cur in col Where cur.Name = SomeName
    

    【讨论】:

      【解决方案3】:

      此链接几乎一目了然地为您提供了所有新的 VB 9.0 功能:

      http://msdn.microsoft.com/en-us/library/ms364068.aspx

      • 隐式类型的局部变量
      • 对象和数组初始化器
      • 匿名类型
      • 深度 XML 支持
      • 查询理解扩展
      • 方法和 Lambda 表达式
      • 可为空的类型
      • 轻松的代表

      【讨论】:

        【解决方案4】:

        VB 9 有一个很酷的 XML 原始类型,让您可以:

        Dim book As XElement = _
            <book category="fiction" isbn=<%= isbnNumber %>>
                <modifiedDate><%= modifiedDate %></modifiedDate>
            </book>
        

        这很酷! (代码取自msdn

        【讨论】:

        • 是的,这很酷。这是我希望在 C# 中使用的 VB 的唯一功能(语法糖)
        【解决方案5】:

        如果您在 2.0 中使用远程处理或序列化,您现在可以将其切换到 WCF 远程处理/序列化,从我所读到的内容中,您会看到性能大幅提升。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-07
          • 2011-02-17
          • 2011-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-11
          • 2012-11-08
          相关资源
          最近更新 更多