【问题标题】:Speed up PI calculation using async?使用异步加速 PI 计算?
【发布时间】:2012-09-01 00:24:34
【问题描述】:

我有计算 pi 的方法。我只是想知道是否可以使用 C#5 的 async/await 功能来加快速度?

public decimal CalculatePi(int measure)
        {
            var target = measure;
            decimal current = 3;
            var incrementing = false;
            var inner = (decimal)1.0;
            while (current < target)
            {
                if (!incrementing)
                {
                    inner = inner - (1/current);
                    current += 2;
                    incrementing = true;
                }
                if (incrementing)
                {
                    inner = inner + (1/current);
                    current += 2;
                    incrementing = false;
                }

            }
            return 4*inner;
        }

【问题讨论】:

    标签: c# asynchronous async-await c#-5.0 pi


    【解决方案1】:

    Async 和 await 最适合在访问其他资源(例如网络或硬盘驱动器)时使用,因为这些资源的速度可能比您想要的慢。在像这样的纯处理器代码上使用它只会使您的代码与其余代码(启动此方法的原始调用代码)共享处理器,就像启动线程一样。要么是因为你的其他代码继续做事而减慢了速度,或者其他代码点击等待并继续,就好像它是同步的一样。使用 async/await 并没有什么大的好处。

    【讨论】:

    • @Cory-ogburn 感谢您的反馈
    • 您可以使用 await 进行 一些 并行处理,例如 Task.WhenAll - 但是 CPU 密集型并行算法最好通过 TPL 完成(这反过来可以暴露async-friendly Task,所以整个TPL处理可以awaited)。
    • 此外,在现代系统上几乎总是有两个或更多处理器,因此即使是基本的并行性也可以轻松获得一些性能提升。
    【解决方案2】:

    我不知道 PI 本身的计算是否正确,但你的算法不适合多线程。

    实际上,您的算法是顺序的并且代码非常少。上下文切换会增加很多开销,您将失去任何好处。

    【讨论】:

    • 计算如果你使用足够高的度量,它会在大约 100 万处开始更准确
    猜你喜欢
    • 2011-09-28
    • 2012-01-08
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多