2

我目前正在开发一项 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]);
        }
    }
}

获得双倍性能

双打数组

获取列表性能

类数组

4

1 回答 1

1

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

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

于 2017-04-19T14:11:44.690 回答