代码之家  ›  专栏  ›  技术社区  ›  abatishchev Karl Johan

调用方法的最快方法

  •  0
  • abatishchev Karl Johan  · 技术社区  · 14 年前

    阅读 this article

    要调用的方法:

    public static void SendData(string value) { }
    

    电话:

    delegate void MyDelegate(string value);
    
    //Slow method - NOT RECOMMENDED IN PRODUCTION!        
    SendData("Update");
    
    // Fast method - STRONGLY RECOMMENDED FOR PRODUCTION!
    MyDelegate d = new MyDelegate(SendData);
    d.BeginInvoke("Update", null, null);
    

    Action send = () => Send("Update");
    send();
    

    或者这个?

    我需要以最大的性能将一个方法调用到SQLCLR触发器中,这样即使是很小的速度提高也有意义。

    5 回复  |  直到 14 年前
        1
  •  20
  •   Eric Lippert    14 年前

    哪个“更快”?

    1) 叫鲍勃给你修剪草坪。等他说完。然后去购物中心。

    第二种方法可以让你更快地到达购物中心。你付出的代价是,你不知道回家时草坪是否会被修剪。使用第一种技术,你 知道 视情况而定 当你知道你回来的时候草坪已经修剪好了,那么第二个技巧就是 .

    现在重要的一点是: 显然,这两种方法都不能比另一种更快地修剪草坪。 什么手术

        2
  •  13
  •   Community CDub    7 年前

    BeginInvoke )因此,在执行方法的同时,调用线程继续执行。

    另外,无论何时调用委托上的BeginInvoke,都应该有相应的EndInvoke,您的示例中缺少了EndInvoke:

    Is EndInvoke() optional, sort-of optional, or definitely not optional?

    IanG on Tap: EndInvoke Not Optional

        3
  •  2
  •   Adam Houldsworth    14 年前

    从时间的角度看,这是一个安慰剂的速度提高 SendData 正在返回到呼叫方。 BeginInvoke ThreadPool 线程并在该线程上启动该方法,然后立即返回调用方—实际工作在另一个线程上。做这项工作所需的时间将保持不变,不管它的线程。它可能会提高应用程序的响应速度,这取决于所做的工作,但委托并不比直接方法调用快——正如我所说,在您的情况下,它似乎更快,因为它会立即返回。

    试试这个:改变 异步调用 Invoke -调用者现在正在阻塞,与呼叫相同 发送数据 正常情况下。

    Delegate.BeginInvoke 事实上,他们没有意识到他们的应用程序是多线程的。。。

    要回答这个问题,直接方法调用总是最快的方法—委托或反射会产生开销。

        4
  •  1
  •   P.McSwain    14 年前

    提高性能的最佳方法是优化触发器将调用的sqlclr存储过程中的方法中的代码。你能提供更多的信息吗?

        5
  •  1
  •   James Curran    14 年前

    请注意,在您引用的文章中,作者讨论了WCF调用,特别是插入和更新数据库的调用。

    在这种情况下需要注意的要点是:

    • 这项工作正在另一台机器上进行。
    • 你得到的唯一信息是“成功!”(通常)或(偶尔)“失败”(作者似乎并不在意)

    因此, 在这种情况下