1

我正在使用新的 TAP 模式进行探测,使用 Task 和 CTP 来实现异步方法。

我有以下代码:

private async void btnAsync01_Click(object sender, RoutedEventArgs e)
        {
            UpdateTxtLog("Enter in button Async01: " + System.DateTime.Now);
            double result = await method01Async();
            UpdateTxtLog("exit in button Async01: " + System.DateTime.Now);
            UpdateTxtLog("result: " + result.ToString());
        }

是让我测试异步方法的 GUI 按钮。

我可以有 method01Aync 的以下实现。

第一的:

private async Task<double> method01Async()
        {
              return await Task.Factory.StartNew<double>(slowMethod);
        }


private double slowMethod()
{
            double doubleDummy = 0;
            for (double i = 0; i < 1000000000; i++)
            {
                doubleDummy++;
            }
            return doubleDummy;
}

第二

private Task<double> method01Aync()
{
return Task.Factory.StartNew<double>(() =>
            {
                //O métodos auxiliares lentos... etc.
                double doubleDummy = 0;
                for (double i = 0; i < 1000000000; i++)
                {
                    doubleDummy++;
                }
                return doubleDummy;
            });
}

第三

private Task<double> method01Aync()
{
            return TaskEx.Run<double>(() =>
            {
                double doubleDummy = 0;
                for (double i = 0; i < 1000000000; i++)
                {
                    doubleDummy++;
                }
                return doubleDummy;
            });
}

第四个私有任务 method01Async() { return TaskEx.Run(slowMethod); }

菲思

private Task<double> method01Async
{
return TaskEx.Run<double>(() =>
            {
                return metodoLento();
            });
}

我的结果是实施 1 和 4 大约需要 22 秒。同时完成另外两个需要5s。为什么会存在这种差异?在实现 1 和 4 中,仅使用与循环相同代码的辅助方法。

我注意到如果我使用 slowMethod() 作为 Task 的构造函数的参数会非常慢,如果我在 TaskEx 或任务 Factory 中使用委托会很快。为什么会这样?有什么区别?

使用 Task.Factory 或 TaskEx.Run 有什么区别?

将异步与任务与 TAP 模式一起使用的最佳实践是什么?

4

2 回答 2

2

运行方法的顺序也很重要。尝试运行它们 2 次,并且只计算第二次运行的时间。无论如何,如果您想了解两者之间的区别,这里是最好的文章:http: //blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

于 2012-04-26T20:10:52.583 回答
2

性能测试是一个棘手的主题。

当您只使用循环和计数器时,试图“欺骗”编译器认为有工作要做,这可能会导致不一致的行为。

这是在提到计时前没有预热的事实之前,这可能是在调试模式打开的情况下完成的,并且计时代码本身没有显示。

总而言之 - 假设您编写在现实世界中调用长期运行过程的方式的微小变化不会您的性能产​​生实质性影响。

于 2012-04-26T20:32:36.277 回答