可以在vb.net中执行内联函数吗?

可以在vb.net中执行内联函数吗?,.net,vb.net,.net,Vb.net,问题出在标题中您不能显式地将函数声明为内联函数,但是JIT优化器如果看到好处,可以自由地内联函数。NET团队明智地决定,这样的功能在编程语言本身中没有位置,因为编译器在决定内联什么方面更好。这是相当激进的,但事实是,现代C++实际上忽略了内联< /代码>指令,它们的决策过程是内联的函数。 < p>我所看到的答案假设你在谈论编译或JIT时间内联,它们完全正确。然而,我听到的单词“inline”的另一个用法是用于lambda表达式,在C#中,类似于: public IEnumerable<in

问题出在标题中

您不能显式地将函数声明为内联函数,但是JIT优化器如果看到好处,可以自由地内联函数。

NET团队明智地决定,这样的功能在编程语言本身中没有位置,因为编译器在决定内联什么方面更好。这是相当激进的,但事实是,现代C++实际上忽略了<代码>内联< /代码>指令,它们的决策过程是内联的函数。

< p>我所看到的答案假设你在谈论编译或JIT时间内联,它们完全正确。然而,我听到的单词“inline”的另一个用法是用于lambda表达式,在C#中,类似于:

public IEnumerable<int> Foo()
{
    int[] numbers = new[] { 1, 5, 2, 5, 6 };

    return numbers.Select(x => x+10);
}
我相信VB9与C相比有更多的限制——例如,我不认为您可以在VB9中使用lambda表达式创建
操作
(或任何其他具有空返回类型的委托类型),而在C中则很容易。同样,我相信lambda在VB9中只能是一个表达式,而在C#中,它可以是大括号中的整个块

从VB10开始,您也可以在VB中创建多行lambda表达式


当然,如果问题真的是指执行而不是源代码,那么所有这些都是无关的:)

内联是CLR(JIT)的责任,函数内联的时间有一些条件:

  • 代码大小小于32字节的IL
  • 该函数不包含“复杂”结构,例如循环、开关等
  • 函数不包含try/catch/finally
  • 该函数未声明为虚拟函数

  • 您可能会发现,就代码而言,32字节不是很强,它适用于快速和小型的if-else条件测试、属性getter/setter。我不认为内联大量代码可以提高任何速度。

    这里有一个场景,它将是一个很好的工具:

    我们有一个标准的日志函数,传递调用方的名字通常很有用。但是,如果将日志记录设置为低详细度,则日志记录函数将简单地返回以帮助提高性能。为了避免调用者对System.Reflection.MethodBase.GetCurrentMethod.Name进行CPU代价高昂的调用,只让日志函数不使用它们,如果我们可以创建一个内联函数,事先决定是否查找该方法的名称,那将是一件好事:

    Public Inline Function GetMyname(iLogLevel) as string
      if iLogLevel < 3 then return ""
      return System.Reflection.MethodBase.GetCurrentMethod.Name()
    End Function 
    
    公共内联函数GetMyname(iLogLevel)作为字符串
    如果iLogLevel<3,则返回“”
    返回System.Reflection.MethodBase.GetCurrentMethod.Name()
    端函数
    
    然后在呼叫者中,我们可以放一条整齐的线,如:

    日志(2,GetMyname(2)&“发生了什么事”)

    但是如果编译器决定不内联GetMyname()(当然会这样),那么日志中出现的methodname将始终是“GetMyname”-没有任何用处


    可以说我过时了,但是如果我们开始把所有的决定都交给编译器(或CLR!),那么我们不妨寻找一份新的职业,把它交给“.Net团队”。有时,软件设计师确实知道得最清楚?

    注意到Tom在5月11日发行的文章,我不得不说,如果你有一个真正对性能至关重要的应用程序,那么使用依赖CLR的语言可能不是你的最佳选择


    事实上,面向对象的设计可能也不是你的最佳选择。你可能想认真地把C当作一个替代品。

    这个问题在5年后仍然有一些活动(已经???)

    只需使用这个属性

    <MethodImplAttribute(MethodImplOptions.AggressiveInlining)>
    
    
    
    @Fredou:问题是:你为什么要这样做?@Konrad我有一个大函数,我想拆分它,当我这样做时,我会失去执行力speed@Fredou当前位置原则上我会怀疑这样一个基准。通过在如此低的级别上欺骗抖动,似乎不太可能获得任何显著的性能增益。如果函数很大,那么函数调用开销应该是微不足道的,我甚至怀疑它是否能够可靠地度量。@Fredou:(cont')…然而,确实可能存在边缘情况。例如,我发现List类自己的实现在性能方面永远不会与本机实现相同。显然,有一些神奇的东西让抖动意识到特定的代码。@Konrad,当我分割函数时,我失去了大约18%的执行速度。你有关于内联条件的文档链接吗?谢谢,很遗憾,我将不得不保留我的长函数,丑陋的部分是,该函数中的代码被复制/粘贴到许多其他函数中。如果你有36个IL字节,那么该函数将从一个紧密的循环中调用。那么为什么要把它放在一个单独的函数中呢?代码重用和文档化。JIT应该更灵活,就像Java中一样。好吧,现在很明显,这个答案与实际问题无关。但是,如果有人在试图找到其他问题的答案时点击此页面,则可能与此相关。我是否应该删除它?想法?你不应该删除它!虽然在你写这篇文章的时候,你提到的VB限制是正确的,但是这些限制已经不存在了。我只是想向其他正在寻找答案的人指出这一点。@Jesse:我会澄清的。真的只有两种情况吗:一种是整个应用程序对性能至关重要,应该放弃设计以提高效率,另一种是设计压倒一切,只要你能投入更多的硬件,就没有必要进行优化?是否不存在应用程序既在CLR上运行,又在某些地方保持高效的条件?当出现性能问题时,是否应该简单地用C重写大型应用程序?
    <MethodImplAttribute(MethodImplOptions.AggressiveInlining)>