请教:WCF速度似乎比Remoting慢

两段极为相似的代码,主要想看看过输与序列化过程两者的用时差异,结果10000次的调用,WCF用了11秒多,remoting用了5秒不到!
这是测试的源代码 

Remoting的服务端

1
2
3
4
5
6
7
8
9
10
11
12
public class RemotCalc : MarshalByRefObject, ICalc
{
    public CalcInfo Calc(CalcInfo pInfo)
    {
        CalcInfo info = new CalcInfo();
        info.Method = string.Format("back_{0}", pInfo.Method);
        info.Para1 = pInfo.Para1;
        info.Para2 = pInfo.Para2;
        info.Result = pInfo.Result + 999;
        return info;
    }
}

WCF的服务端

复制代码
public class WcfCalc : Srv.Interface.ICalc
{
    public CalcInfo Calc(CalcInfo pInfo)
    {
        CalcInfo info = new CalcInfo();
        info.Method = string.Format("back_{0}", pInfo.Method);
        info.Para1 = pInfo.Para1;
        info.Para2 = pInfo.Para2;
        info.Result = pInfo.Result + 999;
        return info;
    }
}
复制代码

代码可以理解为一样的,以下的客户端,两客户端也可以视为一样的过程
WCF客户端

复制代码
static void Main(string[] args)
{
    using(ChannelFactory<Srv.Interface.ICalc> factory = new ChannelFactory<Srv.Interface.ICalc>("Calc2"))
    {
        Srv.Interface.ICalc calc = factory.CreateChannel();
        CalcInfo info = new CalcInfo();
        info.Method = "test";
        Console.WriteLine("press any key to run...");
        Console.ReadLine();
        int max = 10000;
        Console.WriteLine("it's run...");
        DateTime start = DateTime.Now;
        for (int i = 0; i < max; i++)
        {
            CalcInfo res = calc.Calc(info);
        }
        TimeSpan sp = DateTime.Now - start;
        Console.WriteLine("run {0} times use {1}ms ", max, sp.TotalMilliseconds);
        Console.ReadLine();
    }
}
复制代码

 

Remoting客户端

复制代码
static void Main(string[] args)
{
    ChannelServices.RegisterChannel(new TcpClientChannel(), false);
    ICalc remoteobj = (ICalc)Activator.GetObject(typeof(ICalc),
    "tcp://localhost:6666/Calc");
    CalcInfo info = new CalcInfo();
    info.Method = "test";
    Console.WriteLine("press any key to run...");
    Console.ReadLine();
    int max = 10000;
    DateTime start = DateTime.Now;
    for (int i = 0; i < max; i++)
    {
        CalcInfo res = remoteobj.Calc(info);
    }
    TimeSpan sp = DateTime.Now - start;
    Console.WriteLine("run {0} times use {1}ms ", max, sp.TotalMilliseconds);
    Console.ReadLine();
}
复制代码

 不过,有意思的是,我在CalcInfo增加一个集合属性Item,放入100个实例时,情况就完全反过来了。WCF完胜。至此,我感觉在小型的类序列化时,WCF体现不出优势,只有在传输的内容比较多的时候才有优势。
修改后的测试代码 

以下是修改后的CalcInfo类

复制代码
[DataContract]
[Serializable]
public class CalcInfo
{
    public CalcInfo()
    {
        this.Items = new List<CalcItem>(500);
    }
    [DataMember]
    public string Method { get; set; }
    [DataMember]
    public decimal Para1 { get; set; }
    [DataMember]
    public decimal Para2 { get; set; }
    [DataMember]
    public decimal Result { get; set; }
    [DataMember]
    public List<CalcItem> Items { get; set; }

    public static CalcInfo BuildTest(int itemMax)
    {
        CalcInfo result = new CalcInfo();
        for(int i=0;i< itemMax; i++)
        {
            CalcItem item = new CalcItem();
            item.Name = "test item name is " + i;
            item.Para1 = i;
            item.Para2 = i * 100;
            result.Items.Add(item);
        }
        return result;
    }
}
复制代码

 

posted @   生命体验之kevin-Y  阅读(926)  评论(3编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示