TPL数据流提速?(TPL Dataflow Speedup?)

2019-07-30 01:58发布

我不知道下面的代码是否可以进行优化,以更快地执行。 我目前似乎最大程度的发挥以每秒大约140万简单的信息在一个非常简单的数据流结构。 我知道,这个样本处理传递/转换的消息同步,不过,我目前测试TPL数据流基于任务和并发集合为自己的定制解决方案的可能替代。 我知道的术语“并发”已经建议我运行的东西并行,但当前测试目的,我通过同步推在我自己的解决方案的消息,我也得到每秒约5.1万条信息。 缺少什么我在这里,我读TPL数据流被推为高吞吐量,低延迟解决方案,但到目前为止,我必须俯瞰性能调整。 任何人谁可以点我到正确的方向吗?

class TPLDataFlowExperiments
{
    public TPLDataFlowExperiments()
    {
        var buf1 = new BufferBlock<int>();

        var transform = new TransformBlock<int, string>(t =>
            {
                return "";
            });

        var action = new ActionBlock<string>(s =>
            {
                //Thread.Sleep(100);
                //Console.WriteLine(s);
            });

        buf1.LinkTo(transform);
        transform.LinkTo(action);

        //Propagate all Completions down the flow
        buf1.Completion.ContinueWith(t =>
        {
            transform.Complete();
            transform.Completion.ContinueWith(u =>
            {
                action.Complete();
            });
        });

        Stopwatch watch = new Stopwatch();
        watch.Start();

        int cap = 10000000;
        for (int i = 0; i < cap; i++)
        {
            buf1.Post(i);
        }

        //Mark Buffer as Complete
        buf1.Complete();

        action.Completion.ContinueWith(t =>
            {
                watch.Stop();

                Console.WriteLine("All Blocks finished processing");
                Console.WriteLine("Units processed per second: " + cap / watch.ElapsedMilliseconds * 1000);
            });

        Console.ReadLine();
    }
}

Answer 1:

我认为这主要是归结为一点:你的测试几乎是毫无意义的。 所有这些区块都应该做的事情,并使用多个内核和异步操作做到这一点。

此外,在您的测试,很可能是大量的时间都花在同步。 有了更现实的代码,该代码将需要一些时间来执行,所以会出现竞争少,所以实际开销会比你测量什么小。

但实际上回答你的问题,是的,你可以俯瞰一些性能调整。 具体而言, SingleProducerConstrained ,这意味着较少的锁定的数据结构可以被使用。 如果我用这两个块( BufferBlock是完全没用在这里,你可以放心地将其删除),速率约3-4每秒百万的项目提高到超过500万在我的电脑上。



Answer 2:

为了增加svick的回答,测试仅使用一个处理线程一个动作块。 这样,它测试没有什么比使用的块的开销多。

数据流工作在类似F#代理,斯卡拉演员和MPI实现的方式。 每个动作块同时执行单个任务,听输入并产生输出。 加速通过在可以独立地在多个内核来执行的步骤断裂的算法,则只有通过消息给对方提供。

虽然你可以增加并发任务的数量,最重要的问题是设计执行的步骤独立于其他的最大量的流动。



Answer 3:

您也可以增加并行度的数据流块。 这可以提供额外的加速,也可以用线性任务之间的负载均衡帮助,如果你发现你的块充当瓶颈剩下一个。



文章来源: TPL Dataflow Speedup?