【问题标题】:Do I need to worry about inlining in Unity/C#? [duplicate]我需要担心 Unity/C# 中的内联吗? [复制]
【发布时间】:2014-08-12 21:55:08
【问题描述】:

为了代码清晰,我有时会创建一个很明显应该内联的函数,无论是包装器,还是仅在单点调用的函数,或者应该经常调用的短函数,并且是 快。

在 C 中我会毫不犹豫地内联它,但在 Unity/C# 中没有办法做到这一点 AFAIK(this 似乎仅在 .NET 4.5 中可用)。

我是否可以相信编译器足够聪明,可以真正巧妙地内联,或者我最好有时为了性能牺牲代码清晰度,不信任编译器?


当然,这取决于具体情况,过早的优化是邪恶的,你应该分析而不是猜测。但是,对这个主题的总体概述可能仍可用作指导,以进行改进。

【问题讨论】:

  • “在 C 语言中,我会毫不犹豫地内联它”——尽管现代编译器可以忽略你的显式内联。那么与C#没有太大区别吗? :-)
  • @zerkms 你可以用宏内联它。我怀疑在这种情况下编译器会以某种方式取消内联它。
  • @Theodoros Chatzigiannakis:那时它不会是一个函数内联。我确定 op 的意思是使用 inline 关键字。
  • @TheodorosChatzigiannakis 1. 宏很丑:我这样做是为了代码清晰,所以使用宏会破坏目的; 2. Unity 可能无论如何都不支持它们:它甚至不支持项目范围的定义,更不用说宏了!
  • @Lohoris 我指的是 C 中的宏(强制内联,AFAIK),而不是 C# 中的宏(不存在)。因此,这不是对您的问题的回应,而是对评论的回应。不幸的是,我不知道在 C# 中强制内联的任何方法。

标签: c# optimization unity3d inlining


【解决方案1】:

在编译时在 C# 中手动强制内联没有多大意义。当代码运行时,即时编译器可以根据这些启发式决定内联代码:

http://blogs.msdn.com/b/ericgu/archive/2004/01/29/64717.aspx

  • 大于 32 字节 IL 的方法不会被内联。
  • 虚拟函数没有内联。
  • 具有复杂流控制的方法不会被内联。复杂流控制是除 if/then/else 之外的任何流控制;在这种情况下,switch 或 while。
  • 包含异常处理块的方法不会被内联,但引发异常的方法仍然是内联的候选方法。
  • 如果方法的任何形式参数是结构,则该方法不会被内联。

如果您绝对确定该方法必须是内联的,您可以使用上述这些启发式方法使该方法对内联更具吸引力。

MethodImplOptions.AggressiveInlining 对于跨程序集边界内联最有用,我不相信即时编译器可以做到这一点(但我必须检查一下)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多