3

我有一个本地托管的 WCF 服务,它公开了一个返回您传递给它的字符串值的基本方法。

我还有一个单元测试,我尝试调用服务 10000 次,并监控调用完成所需的时间。

我的 using 语句在我的测试中的位置至关重要,如果放置不正确会产生很大的不同,但是我不明白为什么会发生这种情况。

示例 1:(35 秒)

    [TestMethod]
    public void TestGetDataOutsideUsing()
    {
        const int count = 10000;
        var operations = new List<int>();
        for (var i = 0; i < count; i++)
            operations.Add(i);
        using (var proxy = new BasicHttpServiceClient())
        {
            var timer = Stopwatch.StartNew();
            System.Threading.Tasks.Parallel.ForEach(operations, x => { proxy.GetData(x.ToString(CultureInfo.InvariantCulture)); });
            timer.Stop();
            Console.WriteLine("{0:###0.0000000} ms", timer.ElapsedMilliseconds);
            Console.WriteLine("{0:###0.0000000} per millisecond", (count / (decimal)timer.ElapsedMilliseconds));
            Console.WriteLine("{0:###0.0000000} per second", (count / ((decimal)timer.ElapsedMilliseconds / 1000)));
            Console.WriteLine("{0:###0.0000000} per minute", (count / ((decimal)timer.ElapsedMilliseconds / 1000 / 60)));
        }
    }

示例 2:(6.2 秒)

    [TestMethod]
    public void TestGetDataInsideUsing()
    {
        const int count = 10000;
        var operations = new List<int>();
        for (var i = 0; i < count; i++)
            operations.Add(i);
        var timer = Stopwatch.StartNew();
        System.Threading.Tasks.Parallel.ForEach(operations, x =>
            {
                using (var proxy = new BasicHttpServiceClient())
                {
                    proxy.GetData(x.ToString(CultureInfo.InvariantCulture));
                }
            });
        timer.Stop();
        Console.WriteLine("{0:###0.0000000} ms", timer.ElapsedMilliseconds);
        Console.WriteLine("{0:###0.0000000} per millisecond", (count / (decimal)timer.ElapsedMilliseconds));
        Console.WriteLine("{0:###0.0000000} per second", (count / ((decimal)timer.ElapsedMilliseconds / 1000)));
        Console.WriteLine("{0:###0.0000000} per minute", (count / ((decimal)timer.ElapsedMilliseconds / 1000 / 60)));
    }

第一个示例和第二个示例之间的唯一区别是 using 语句的位置。我原以为在 ForEach 中使用 using 语句会花费更长的时间,但事实证明并非如此。

为什么会这样,上面的哪个例子是测试这个的准确方法?我可能以错误的方式进行此测试吗?

我想做的就是对我的服务进行 10000 次并发调用,看看需要多长时间。

4

2 回答 2

4

在第一个示例中,只有一个Proxy对象;在第二个示例中,有多个Proxy对象。

我认为这与using语句没有直接关系,而是如何使用。在第一个示例中,Proxy对象成为并行操作的瓶颈。

于 2013-02-05T11:48:04.947 回答
2

这是两个非常不同的事情:

  • 在第一个示例中,您在单个代理对象上运行多个线程,这有效地序列化了处理1并破坏了并行性。
  • 在第二个示例中,每个线程都有自己的代理对象,这允许它独立于(并同时运行)其他线程运行。

工作量更小于等于2,但第二个示例完成得更快,因为更多的工作可以并行完成。


1我假设那里有一个锁,否则你有一个竞争条件。

2忽略创建所有这些代理的成本。

于 2013-02-05T12:00:24.043 回答