日期:2014-05-20  浏览次数:21007 次

C/S 结构的程序速度总是很慢,有没有什么好的优化办法?(来者有份)
首先跟大家讲一下我们现在这个项目的结构模式:

1、服务端采用WCF编写的,主要负责数据的读写操作
2、客户端传入相应的语句与参数来从服务器获取数据

遇到的问题:

每次打开UI界面的时候速度都很慢,每次都要等上好几秒钟,哪怕查询结果只有十多条数据,总是让人觉得这个系统是不是挂掉了,后来加了一个假的进度条来显示加载数据的过程,用户体验好了一些,但还是要等好久

有没有人能提供一些优化的思路呢?

我下面把我自已的一些思路写下来,大家帮我看看,帮我提提建议,或者有更好的优化方法那更好:

1、首先把所有用户都共同的系统基础数据保存到本地,每次登陆系统的时候自动更新本地的基础数据(如分组类型数据、职位、部门、区域),这样每次打开界面或查询数据的时候就不需要从数据器获取了,直接从本地读取就可以了;

2、其次,把系统的所有查询语句改成用存储过程,减少上传服务器的数据量,只上传存储过程名称和相关的参数值就可以了

3、再就是优化数据库的索引

4、最后压缩需要传输的数据,以减少传输返回的数据量

希望这样来提搞系统的性能,不知道能提高多大的性能,你们认为如何呢,有没有其它更好的办法呢?



------解决方案--------------------
1. 缓存的意思,许多人都片面理解为在客户端保存一些数据。这其实谁都会做。真正关键的技术是看你会不会控制缓存依赖,即保证缓存的数据不是脏数据,当后台数据改变的时候缓存中的数据就有一部分(至少包括所有脏数据)被自动清除了。所以缓存依赖技术,才是缓存技术的本质。

2. 你的WCF是用来传送sql语句?这个我实在是无言了。这不是我所知道的业务服务的理念。

3. 写查询sql的时候,比如你写到“where file1=...”或者“inner join ... on a.xxx=b.yyy....”这类代码的时候,就知道查询条件有没有索引可用了。这是一个基本的编程素质。我一般来说不把它当作什么技术,而是当作基本常识。

4. 别忘了,执行压缩本身也是很占时间的。对于那些古老的、大页面的传送,也许压缩可行。但是对于小而短促的通讯,压缩了可能反而字节数更大。如果盲目压缩,还不如先看看是不是自己的服务功能设计得过于臃肿了。


我建议你们将WCF先放在一边,让许多服务也可以使用简单的比如http、tcp方式通讯,来对比一下速度。同时假设你们的服务器不是asp.net而是windows service,那么可能再也不会遇到那种明明没有进行查询和计算却“等上好几秒钟”的情况。特别是对于大数据量的服务,要提供更简单的通讯方式。
------解决方案--------------------
where file1=.. --> where field=..
------解决方案--------------------
探讨

1. 缓存的意思,许多人都片面理解为在客户端保存一些数据。这其实谁都会做。真正关键的技术是看你会不会控制缓存依赖,即保证缓存的数据不是脏数据,当后台数据改变的时候缓存中的数据就有一部分(至少包括所有脏数据)被自动清除了。所以缓存依赖技术,才是缓存技术的本质。

2. 你的WCF是用来传送sql语句?这个我实在是无言了。这不是我所知道的业务服务的理念。

3. 写查询sql的时候,比如你写……

------解决方案--------------------
哦,我知道http是基于tcp的,web service等是基于http的。不要纠结我这里貌似把它们对立起来的用词。我把它们分开,是指基于原本简单的机制来直接编写程序。
------解决方案--------------------
从通信角度将WCF使用的XML序列化,以及Remoting使用的二进制序列化都具有很大的数据浪费现象,你通过抓包看一看序列化后的字节串就知道了,一个20几个字节的对象,序列化后会达到数百个字节!如果转换为datatable再序列化那就是数千个字节。
另外再说远点,使用异步通信的效率会远高于同步通信,WCF及REMOTING在支持异步方面都有很多实际问题。
------解决方案--------------------
可以尽量少使用一些复杂的类型作为数据交换的类型.

------解决方案--------------------
好多星星、、、看来我不能发表意见了。。。默默的离开。
------解决方案--------------------

非常感谢sp1234这么详细的回复,鄙人不才,让您见笑了

服务端是自定义的服务宿主,WinForm的形式的
客户端也是WinForm形式的

客户端与服务端的通信采用的是NetTcpBinding的绑定方式,对于您给我的回答,我可以收获到的最少有两点:
第一、尽可能的把Sql语句写成存取过程(我不想把具体的读取数据的业务写在服务端,服务端是一个公共的服务端,可用于多个不同的项目),减少数据的传输量。
第二、对的大数据量的采用数据压缩的方式来传输

sp1234,我的这样理解对吗?

还有我有两个凝问想请教一下sp1234,

探讨

3. 写查询sql的时候,比如你写到“where file1=...”或者“inner join ... on a.xxx=b.yyy....”这类代码的时候,就知道查询条件有没有索引可用了。这是一个基本的编程素质。我一般来说不把它当作什么技术,而是当作基本常识。


------解决方案--------------------
首先感谢etudiant6666的提醒,

探讨
从通信角度将WCF使用的XML序列化,以及Remoting使用的二进制序列化都具有很大的数据浪费现象,你通过抓包看一看序列化后的字节串就知道了,一个20几个字节的对象,序列化后会达到数百个字节!如果转换为datatable再序列化那就是数千个字节。
另外再说远点,使用异步通信的效率会远高于同步通信,WCF及REMOTING在支持异步方面都有很多实际问题。

------解决方案--------------------
自已顶起来