【问题标题】:What attributes help runtime .Net performance?哪些属性有助于运行时 .Net 性能?
【发布时间】:2008-09-16 07:44:52
【问题描述】:

我正在寻找可用于通过向加载程序、JIT 编译器或 ngen 提供提示来确保我的 .Net 应用程序的最佳运行时性能的属性。

例如,我们有 DebuggableAttribute 应设置为不调试且不禁用优化以获得最佳性能。

[Debuggable(false, false)]

还有其他我应该知道的吗?

【问题讨论】:

    标签: .net performance runtime


    【解决方案1】:

    Ecma-335 在附件 F“不精确的错误”中为宽松的异常处理(所谓的 e-relaxed 调用)指定了更多的 CompilationRelaxations,但它们尚未被 Microsoft 公开。

    这里特别提到了 CompilationRelaxations.RelaxedArrayExceptions 和 CompilationRelaxations.RelaxedNullReferenceException。

    当您在 CompilationRelaxationsAttribute 的 ctor 中尝试一些整数时会发生什么会很有趣;)

    【解决方案2】:

    还有一个:文字字符串(在源代码中声明的字符串)默认情况下interned 进入池以节省内存。

    string s1 = "MyTest"; 
    string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
    string s3 = String.Intern(s2); 
    Console.WriteLine((Object)s2==(Object)s1); // Different references.
    Console.WriteLine((Object)s3==(Object)s1); // The same reference.
    

    虽然在多次使用相同的文字字符串时会节省内存,但维护池会花费一些 cpu,并且一旦将字符串放入池中,它就会一直停留在那里直到进程停止。

    使用CompilationRelaxationsAttribute,您可以告诉 JIT 编译器您真的不希望它实习所有文字字符串。

    [assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
    

    【讨论】:

    • 对此要小心,因为不实习字符串实际上可能会损害性能。可以通过简单地比较引用(指针)来执行实习字符串的相等比较,这比比较字符串值要快得多。
    • 是的,但是您必须编写显式使用字符串实习的代码。而且由于你不能指望文字被实习,你必须自己做(String.Intern)。这里提到的属性不影响这一点。
    • 字符串的 operator== 知道是否需要比较引用或内容。 csgero 的观点似乎是,在非实习的情况下,operator== 总是必须进行基于内容的比较,这可能比实习字符串的基于引用的比较更昂贵。
    【解决方案3】:

    我找到了另一个:NeutralResourcesLanguageAttribute。根据this 博客文章,它通过指定当前(中性)程序集的区域性来帮助加载程序更快地找到正确的附属程序集。

    [NeutralResourcesLanguageAttribute("nl", UltimateResourceFallbackLocation.MainAssembly)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2021-05-21
      • 2020-08-12
      • 2017-11-29
      • 1970-01-01
      相关资源
      最近更新 更多