【问题标题】:How do I get the best performance from a Windows/wcf Service in C#?如何从 C# 中的 Windows/wcf 服务获得最佳性能?
【发布时间】:2017-04-18 21:51:10
【问题描述】:

我目前正在开发一项 Windows 服务,该服务将处理通过 USB 连接到我的计算机的多个测量仪器的数据采集。它将向 SQL 数据库发送一些数据,但我也在为机器创建另一个应用程序,以便能够在本地实时查看数据,并且在最坏的情况下,我将处理超过 7,000,000 个元素的数组/列表场景。

目前我正在使用带有 NetNamedPipeBinding 的 WCF 进行进程间通信,并且效果很好(我可以在不到四分之一秒的时间内传输一个包含超过 700 万个双精度的数组)。所以我并不急需答案,但我很好奇是否有更快或更轻松地访问服务中数据的更快方法。

我一直在考虑深入研究非托管内存并让服务返回指向数组的指针或类似的东西。但是,如果收益很小,我不想为此烦恼。只是当传递一个类时(我敢打赌一个结构的开销会更少),性能会下降,我正在努力打好基础,以防我开始处理更复杂的数据类型。

服务相关代码

public class testclass
{
    public double dub1 {get;set;}
    public double dub2 {get;set;}
}
public testclass[] GetList(int n)
    {
        sw.Restart();
        testclass[] numbers = new testclass[n];
        for (var i = 0; i < n; i++)
        {
            numbers[i] = new testclass { dub1 = i, dub2 = i };
        }
        numbers[0].dub1 = (double)sw.ElapsedMilliseconds;
        return numbers;
    }
public double[] GetDoubles(int n)
    {
        sw.Restart();
        double[] numbers = new double[n];
        numbers[0] = (double)sw.ElapsedMilliseconds;
        return numbers;
    }

客户相关代码

class Program
{
    static void Main(string[] args)
    {
        while (1 == 1)
        {
            Console.WriteLine("Size of List");
            var number1 = int.Parse(Console.ReadLine());
            var sw = new Stopwatch();

            var test = new ServiceReference1.CalculatorClient();

            sw.Restart();
            var list = test.GetDoubles(number1).ToList();
            Console.WriteLine("Response Time: "+ sw.ElapsedMilliseconds);
            Console.WriteLine("Time to make list: "+list[0]);
        }
    }
}

GetDoubles 性能

GetList 性能

【问题讨论】:

  • 这是打字错误吗? GetList 方法循环整个数组,而 GetDoubles 对第一个数组项进行单个赋值

标签: c# arrays wcf netnamedpipebinding


【解决方案1】:

我只是在这里猜测,但我希望序列化可能是问题的一部分,有两个步骤来处理这个问题(至少)。一种是使用 DTO 来确保您只传递需要的内容并使用高性能数据类型,另一种是使用不同的序列化程序,我听说过 protobuf-net 但从未使用过它。

我知道你上面的例子很简单,但如果你的测试类可以创建一个字节数组 DTO 并在客户端接受一个作为构造函数,你可能会有一个有用的模式。

【讨论】:

  • 谢谢,很抱歉回复晚了。我一直忙于另一个不相关的项目,但当我回到这个项目时,我会看看 DTO,然后告诉你结果如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多