高级性能服务器编程模型【IOCP完成端口】开发实现【三】
摘要:一开始学习完成端口编程的时候,我看的资料是小猪的关于完成端口的教程和源代码。 好在,我还有那么一点点C++的底子,不是很好,勉强看得懂吧。 其实看得懂不是IOCP完成端口的具体原理,而是这些C++代码结构逻辑而已。 很惨,对吧。 后来我采用Delphi的代码结构来做,说真的,当时一样是一塌糊涂,哈哈。 很多人说,IOCP完成端口被神化了,其实这个很正常啊,不懂的时候,看啥都是神秘的。 其实小猪的这个代码很有用,他的执行测试Demo是我见到的最快的程序。 Delphi编码的程序,很多人的程序我测试过了,反应确实没有他快。客户端发送几百条数据,一边发,服务端一边不断地接收刷新数据...
阅读全文
posted @
2012-08-30 00:10
一笑如风
阅读(3850)
推荐(0) 编辑
高级性能服务器编程模型【IOCP完成端口】开发实现【二】
摘要:因为需要参考各种资料,所以还是需要一些时间才能够做好的。 而且在开发中,还会面对一些不得不仔细去解决的问题。 我打算尽量从Win32API的基础上面进行开发,能够不使用Delphi封装的类就不用,任何类都是无法避免多余的开销,而我们往往只使用一两个功能就付出那么大的代价,是否值得???? 当然,别谈跨平台了,在中国,还是老老实实在Windows系统上面搞开发吧,而且服务器编程跟客户端没有直接的关系,客户端,你仍然可以采用任何语言进行开发,或者只使用JSocket的客户端控件就行。当然,如果时间允许,我们也可以自己封装一个,其实都差不多的,没有见得好到那里去。 客户端跟服务端不同,不...
阅读全文
posted @
2012-08-27 16:51
一笑如风
阅读(1978)
推荐(0) 编辑
高级性能服务器编程模型【IOCP完成端口】开发实现【一】
摘要:本来打算先完成一些汇编上的事情,再等以后时间充足的时候,再搞的。 但是我看着那些源代码,心理确实不是滋味。 因为不管你是现在做或者以后做,都必须面对这些要命的问题。 我不知道大家看着下面这个结构,心理是什么感想,我只知道要改的话,比去完成一个IOCP完成端口控件所需要的时间还要多得多。 1 TGateInfo = record 2 Socket: TCustomWinSocket;3 sIPaddr: string; 4 sReceiveMsg: string;5 UserList: TList;6 dwKeepAliveTick: Lo...
阅读全文
posted @
2012-08-26 22:17
一笑如风
阅读(2753)
推荐(0) 编辑
探讨【IGE】的源代码【六】,承接【五】,内存池管理。
摘要:上篇,我们提到了内存创建和释放带给长时间运行的服务器性能的损害问题。 当然还可能增加了CPU的相当的开销。 那么如何解决这个问题呢。 在这里只做一些讨论,具体实现,是你自己的事情。 到目前为止,我们能够做的都是管理一个内存池。 一开始,我们先分配好一批内存,把这批内存标注为空闲。 在客户端连接入来的时候,从空闲链表里面取第一个结构指针,填充内存。 Delete(0);删除空闲链表索引,是删除,不是释放,这个要记住。 然后使用一个正在使用链表来管理已经被调用的内存,使用ADD操作。 那么跟客户端断开连接后,将该释放的或者需要置Nil的对象处理之后。 从正在使用的链表删除该...
阅读全文
posted @
2012-08-25 15:19
一笑如风
阅读(717)
推荐(0) 编辑
探讨【IGE】的源代码【五】。
摘要:这样做,有没有问题???? TGateInfo = record Socket: TCustomWinSocket; sIPaddr: string; sReceiveMsg: string; UserList: TList; dwKeepAliveTick: LongWord; end; pTGateInfo = ^TGateInfo; 上面正常的信息结构,当然里面包含了一个链表对象,呵呵。procedure TFrmMain.GSocketClientConnect(Sender: TObject; Socket: TCustomWi...
阅读全文
posted @
2012-08-24 22:07
一笑如风
阅读(727)
推荐(0) 编辑
Delphi更高效率的编程方式的思考【二】
摘要:谈论了很多关于目前环境的话题,现在是否可以开始讨论主要的题目了? 好吧,是需要理清楚思路的。 在开发里面,我常常在想,如何提高编程的速度和编程的质量。 我考虑了面向对象的模式,但是我发现,它并不能够解决任何问题,相反会带来很多问题。 于是我把编程开发提升到设计开发上面,效率会如何呢,我们来看下。 姑且不讨论这种模式的各方面问题。 因为有美术设计的经验,我们是否可以借鉴一下设计的模式来设计编程开发??? 首先我们定义概念,这个是个什么样的软件,功能定性?或者是市场定性?? 针对什么样子的市场???居于什么样的概念??? 很复杂,算了,简单一点。 说功能。 一个软件包含很...
阅读全文
posted @
2012-08-23 21:19
一笑如风
阅读(1564)
推荐(0) 编辑
Delphi更高效率的编程方式的思考【一】
摘要:我想还是有必要花点时间来整理一下思路的,就是说有必要写一些什么吧。 博客园有一点不好的地方是:没有自己的客户端,我不喜欢安装那些乱七八糟的程序。 虽然博客园提供了一个居于微软的软件,但是我不喜欢使用它,其实我不明白的是为什么博客园还要采用第三方的软件? 博客园应该有自己的客户端!理由有很多。 虽然我们大家都喜欢鼠标一点击,立即进入到属于自己的领地里面,而不是通过第三方的浏览器。 事实上是我很不喜欢浏览器,只是目前太忙了,以后有时间我一定做自己的程序,完全废弃使用第三方的浏览器来采集资料。 唠叨了一下,烦不烦?呵呵,OK,到此为止! 看了一下刘艺的模式编程,好吧,我承认,我...
阅读全文
posted @
2012-08-23 21:12
一笑如风
阅读(1032)
推荐(0) 编辑
探讨【IGE】的源代码【四】。
摘要:是不是一定需要安装DB2000这个数据库?? 最初我也不太肯定,因为我还没有看源代码。 现在看了,完全可以不必安装和配置这个玩意了,没有必要。 看下面就应该知道没有这个必要—— 1 //加载物品数据 2 function TFrmDBSrv.LoadItemsDB(): Integer; 3 var 4 i, Idx: Integer; 5 StdItem: pTStdItem; 6 nRecordCount: Integer; 7 resourcestring 8 sSQLString = 'select * from StdItems'; 9 begin10 ...
阅读全文
posted @
2012-08-14 22:33
一笑如风
阅读(932)
推荐(0) 编辑
探讨【IGE】的源代码【三】。
摘要:看了源代码,相信大家都知道IGE的源代码出自飞尔早期泄露的源代码。 说真的,这些混乱和不合理以及低水准的编程水平和方式不是韩国程序员的错。跟他们没有关系。 服务端的程序尽可能减少不必要的开销,哪有什么东西都挤到一起的?? 就拿服务器启动器来说,配置项目以及开区清理这些,不应该放在主窗体上面进行处理。 看到无尽长的代码挤在一份主执行文件里面,你的感受会如何?? 架构结构一定要合理,为什么,因为合理就等于是合理分配资源。 为什么不应该在主窗体文件里面处理这些东西,因为我们知道,配置文件一旦生成,服务器启动后,这些东西就没有用了。 可是它们这些超大量的控件和各种代码的开销仍然是不可...
阅读全文
posted @
2012-08-13 08:13
一笑如风
阅读(972)
推荐(0) 编辑
Delphi结构类型包含String字符串使用需要注意的地方
摘要:有些人提倡当在结构里面包含字符串类型的时候最好采用定长的方式。 比如像下面这样: TCSInfo = record Cs_Str :String; Count :Integer; CS_Str2 :String; end; 如果Cs_Str在这里不采用定长的方式,那么当采用SizeOf()获取结构的大小的时候,可能得不到正确的大小值。 另外这个首位成员变量的值,很有可能出现随机值的情况,就是你已经给它赋了值,在当前的显示是正确的,但是—— 如果把该结构保存为结构文件的时候,下次打开取值的时候就会出现随机值的情况。 但是后面的变量的值是正常的,所以如果字符串变量...
阅读全文
posted @
2012-08-12 17:09
一笑如风
阅读(2569)
推荐(0) 编辑
关于Delphi赋值的问题
摘要:平时我不太在意使用 := 来进行赋值。 有次,在做一个程序测试的时候,请一个朋友提供帮助,他告诉我,程序最大的问题是出现在: 采用 := 方式来进行赋值。最后的结论是我的基础不行。 呵呵~我一向很谦虚。 后来我不断地看代码,一行行地看,希望找出这些采用:= 有啥问题。 因为我很明白,也许我把某个内存地址弄错了,但是绝不会是我的基础不行。 因为:= 这种情况分好几种。 通常的理解是值复制的方式,但是值也要看啥值,如果是指针就另当别论了。 而我不关心这些赋值是否是基础的问题,因为程序大部分操作的都是指针。 指针赋值分两种情况,一种是直接采用@把该指针自身的地址赋给变量,一种是...
阅读全文
posted @
2012-08-11 17:35
一笑如风
阅读(3108)
推荐(0) 编辑
探讨【IGE】的源代码【二】。
摘要:首先开始服务端的源代码重新架构。 为什么选择IGE源代码是有原因的,或者我认为他的源代码结构不是很混乱吧。 毕竟不是全部照抄,只需要了解它的执行逻辑结构,然后重新按照自己的想法来实现。 这个很重要,只要看下去就会明白。 服务器有几个需要注意的地方: 第一、内存碎片,这个需要注意,否则服务器会在长时间运行后,性能会越来越差。 1、内存碎片的产生多出现在内存的不断分配和释放上面。 2、对象的创建和析构也会产生内存碎片。 3、结构化的参数——这个是听说的,具体没有试验。 第二、内存的使用,这个是这篇文章的重点。 。。。。。。。。。。。。。。。。。 看了服务端...
阅读全文
posted @
2012-08-11 16:38
一笑如风
阅读(1015)
推荐(0) 编辑
探讨【IGE】的源代码【一】。
摘要:这段时间看了不少的传奇的源代码。 感觉一个字,烂,不是一般的烂。 我相信大家都知道。 同时大家肯定明白,如果重新优化和架构,效率肯定要比原来的代码要高很多很多倍。 首先说一个地方,virtual和dynamic,虚方法和动态方法。显然代码里面大部分都是采用动态方法,这个要命啊,慢啊。 关于虚方法和动态方法的最大区别是,虚方法速度快,比动态方法快多少倍未知。缺点是费空间。动态方法费时间省空间。 一般我们是不经常调用而且速度不是居于首位的时候,我们采用动态方法。相反经常调用频繁,而且速度居于首位的,我们采用虚方法。 这些是毫不迟疑的。 但是那些(大家明白的源代码)为什么采用动态...
阅读全文
posted @
2012-08-04 18:30
一笑如风
阅读(1108)
推荐(0) 编辑