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

Remoting的服务端

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 + ;
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 = ;
Console.WriteLine("it's run...");
DateTime start = DateTime.Now;
for (int i = ; 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 = ;
DateTime start = DateTime.Now;
for (int i = ; 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>();
}
[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=;i< itemMax; i++)
{
CalcItem item = new CalcItem();
item.Name = "test item name is " + i;
item.Para1 = i;
item.Para2 = i * ;
result.Items.Add(item);
}
return result;
}
}

请教:WCF速度似乎比Remoting慢的更多相关文章

  1. 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

    一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 . ...

  2. .Net remoting, Webservice,WCF,Socket区别

    传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service).比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务& ...

  3. 关于通信的关键词UDP/(TCP/IP)/IPC/RPC/.NET Remoting/WebService/WCF/Http 系列

    OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行实践: ...

  4. Remoting、WCF、WebAPI、WCFREST、WebService之间的区别与联系

    在.net平台下,有大量的技术让你创建一个服务,像Web Service,WCF,Web API,Remoting,我们来对比一下他们的区别与联系 Remoting Web Service WCF W ...

  5. WCF服务一:WCF服务简介

    一.回顾开发历史: 软件架构的设计经历了:从面向对象程序,到面向组件程序设计,再到面向服务程序设计.这三种方式都致力于同一个目标:封装和重用. 面向对象程序设计:类封装功能并提供代码重用. 面向组件程 ...

  6. XAF How to: 实现一个WCF Application Server 并配置它的客户端应用

    本主题描述了如何实现一个 WCF 中间层应用程序服务器及如何配置 XAF客户端连接到此服务器. 注意 本主题演示可以由解决方案向导自动生成的代码.执行操作时,如果你想要在现有的 XAF 解决方案中实现 ...

  7. 跟我一起学WCF(13)——WCF系列总结

    引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ ...

  8. 年前辞职-WCF入门学习(1,2)

    前言 周一的时候辞职了,离开了从12年毕业后8月份开始一直到现在的公司. 辞职之后当然是玩.玩了若干天的游戏,真的是没日没夜啊,但是玩的太坑,怒删游戏.话说上次玩还是在14年7月份.下次还是过年回家再 ...

  9. WCF揭秘(一)——简单的WCF开发实例

    一.WCF是什么 WCF是微软为了实现各个开发平台之间的无疑缝连接而开发一种崭新工具,它是为分布式处理而开发.WCF将DCOM.Remoting.Web Service.WSE.MSMQ.AJAX服务 ...

随机推荐

  1. python大法好——网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  2. python大法好——装饰器、生成器、迭代器

    1.装饰器 1. 不能修改被装饰的函数的源代码  2. 不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1 函数即“变量” 2 高阶函数     a:把一个函数名当做实参传给另外一个函数(不修改 ...

  3. Redux的梳理

    学习Redux之前,我了解了它需要去解决什么问题: 用户使用方式复杂 不同身份不同使用方式 多个用户可以协作 与服务器大量交互,或者使用websocket 视图数据从多个来源获取 共享组件状态 组件之 ...

  4. Android中五大字符串总结(String、StringBuffer、StringBuilder、Spanna

    https://www.aliyun.com/jiaocheng/2861.html?spm=5176.100033.1.35.2ed56b03CbsYFK 摘要:String.StringBuffe ...

  5. Could not find a package,configuration file provided by "G2O" ,G2OConfig.cmake,g2o-config.cmake

    因为项目需要使用到g2o,所以自己从git上面clone下来, git clone https://github.com/RainerKuemmerle/g2o.git 然后: cd g2o mkdi ...

  6. HttpRunnerManager安装部署

    uname -a cat /etc/redhat-release 1.安装docker.mysql.rabbitmq sudo yum update curl -fsSL https://get.do ...

  7. springboot读取配置注解@ConfiguratioinProperties和@Value的区别

  8. EasyUI DataGrid设置列宽为百分比导致表头和内容错位的解决方法

    在DataGrid中设置列宽为百分比一般是没有问题的 columns: [[{ title: '内容', field: '__EMPTY', width: '40%' }, { title: '隐患级 ...

  9. java学习笔记(五):公共类

    什么是公共类,公共类就是和源文件名同名的类,举例来说:类的名称是 public class aaa{},那么源文件就应该是 aaa.java. 每个源文件中只能有一个公共类. 每个源文件可以有很多非公 ...

  10. Java 学习笔记提高篇

    Java笔记(提高篇)整理   主要内容: 面向对象 异常 数组 常用类 集合 IO流 线程 反射 Socket编程 1.  面向对象 1.1包 用来管理Java中的类, 类似文件夹管理文件一样. 因 ...