gpt4 book ai didi

c# - 如何在 C# 中从 Windows/wcf 服务获得最佳性能?

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:11 25 4
gpt4 key购买 nike

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

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

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

服务相关代码

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]);
}
}
}

获得 double 表现

Array of Doubles

获取列表性能

Array of classes

最佳答案

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

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

关于c# - 如何在 C# 中从 Windows/wcf 服务获得最佳性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com