﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-oldworm-随笔分类-c++</title><link>http://www.cppblog.com/oldworm/category/15068.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 01 Feb 2011 12:35:45 GMT</lastBuildDate><pubDate>Tue, 01 Feb 2011 12:35:45 GMT</pubDate><ttl>60</ttl><item><title>Windows下两种iocp实现的差距</title><link>http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Tue, 01 Feb 2011 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139662.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139662.html</trackback:ping><description><![CDATA[
<p class="MsoNormal"><span lang="EN-US">Windows</span><span style="font-family:
宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">下两种</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">实现的差距</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">之前几天说过，因为经典</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">实现（以下简称经典实现）多个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程绑定在一个</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上，这样内部管理了</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">队列的处理，内部决定是不是需要线程切换，我上次修改的一个版本（以下简称实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">），用了多个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，每个</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">队列仅绑定一个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，一组用户共享一个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，这和经典的多线程</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">模型的做法是很相似的，这样每个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程是可以独立控制了，但理论上这种做法没有发挥</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">自动管理线程切换的优势，昨晚没事用这两种实现分别做了个</span><span lang="EN-US">echoserver</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">测试了一下，这两套实现代码仅</span><span lang="EN-US">40</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">行左右不同，其他完全一样，效果真的是差很多，测试仅用一个进程模拟了</span><span lang="EN-US">4000</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个客户端，每秒</span><span lang="EN-US">1</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个包，先看实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的，</span><span lang="EN-US">cpu</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">占</span><span lang="EN-US">14%</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，</span><span lang="EN-US">1</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个</span><span lang="EN-US">accept</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，</span><span lang="EN-US">1</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个主线程，其他线程都没干活闲置。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse; border-width: initial; border-color: initial; ">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Cpu</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Memory</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Threads</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">handles</span></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">14</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">40088k</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">8</span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">4236</span></p>
  </td>
 </tr>
</tbody></table>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">再看经典实现，</span><span lang="EN-US">cpu</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">几乎一直是</span><span lang="EN-US">0%</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程，</span><span lang="EN-US">accept</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">也是在</span><span lang="EN-US">io</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">线程里面处理，其他跟实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">一样，测试客户端也一样。</span></p>

<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse; border-width: initial; border-color: initial; ">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Cpu<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Memory<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Threads<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">handles<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">0<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">39244k<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">7<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">4336<o:p></o:p></span></p>
  </td>
 </tr>
</tbody></table>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">说实话，在测试之前我也没想到有这么大的差距，经典实现就是</span><span lang="EN-US">1.2w</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个连接连上来还是这样，就是内存占用多一点：</span></p>

<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse; border-width: initial; border-color: initial; ">
 <tbody><tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Cpu<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Memory<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">Threads<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">handles<o:p></o:p></span></p>
  </td>
 </tr>
 <tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes">
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">0<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.5pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">112068k<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">7<o:p></o:p></span></p>
  </td>
  <td width="142" valign="top" style="width: 106.55pt; padding-top: 0cm; padding-right: 5.4pt; padding-bottom: 0cm; padding-left: 5.4pt; ">
  <p class="MsoNormal"><span lang="EN-US">12280<o:p></o:p></span></p>
  </td>
 </tr>
</tbody></table>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">习惯上总有人喜欢拿</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">和</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">来对比，我到现在也没看到真正公平的对比，就算是相对公平的也没见到，因为在我看来，要对比硬件应该是一样的，</span><span lang="EN-US">os</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">都应该是最新的，最重要的是，</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">端程序应该都是发挥了各自优势的，如果拿我这里的实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">去代表</span><span lang="EN-US">iocp</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的水平和</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">对比，势必造成比</span><span lang="EN-US">epoll</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">差很多的结果，然而这显然是不正确的。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US">epoll</span><span style="font-family:宋体;
mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">经典多线程模式实际实现和实现</span><span lang="EN-US">2</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">很相似，理论上也有类似的线程切换问题，不知道效率怎样。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-02-01 10:48 <a href="http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回调函数的常见实现方式及速度比较</title><link>http://www.cppblog.com/oldworm/archive/2011/01/30/139610.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Sun, 30 Jan 2011 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/01/30/139610.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139610.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/01/30/139610.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139610.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139610.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">回调函数的常见实现方式及速度比较</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">回调函数实在是用得太广泛，回调函数又有多种实现方式，如：</span></p>

<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US" style="mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"><span style="mso-list:Ignore">1、<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; </span></span></span><!--[endif]--><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">静态函数</span></p>

<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US" style="mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"><span style="mso-list:Ignore">2、<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; </span></span></span><!--[endif]--><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">虚函数</span></p>

<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US" style="mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"><span style="mso-list:Ignore">3、<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; </span></span></span><!--[endif]--><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">函数对象</span></p>

<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US" style="mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"><span style="mso-list:Ignore">4、<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; </span></span></span><!--[endif]--><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">传统</span><span lang="EN-US">c</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">函数，通过一个</span><span lang="EN-US">void *</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">传递对象地址，内部强制转换</span></p>

<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US" style="mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"><span style="mso-list:Ignore">5、<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; </span></span></span><!--[endif]--><span lang="EN-US">fastdelegate</span></p>

<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US" style="mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"><span style="mso-list:Ignore">6、<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; </span></span></span><!--[endif]--><span lang="EN-US">Tr1::function + bind</span></p>

<p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;
mso-char-indent-count:0;mso-list:l0 level1 lfo1"><!--[if !supportLists]--><span lang="EN-US" style="mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin"><span style="mso-list:Ignore">7、<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp; </span></span></span><!--[endif]--><span lang="EN-US">Boost::Function + bind</span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">基本上速度是按照由快到慢的顺序排列的，就是</span></p>

<p class="MsoNormal"><span lang="EN-US">1 &gt; 2 &gt; 3 &gt; 4 &gt; 5 &gt; 6 &gt; 7</span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">其实</span><span lang="EN-US">234</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">速度很接近，有的时候函数对象效率更高一点，基本上越是高级的方法使用起来越方便，但速度越慢，越是传统的方法速度越快，呵呵，看来做</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">端程序要综合考虑效率太新的东西还是要少用啊，还是用传统的方法比较靠谱一点，当然如果调用次数不多的地方，使用更方便的方法还是好一些，毕竟我们要综合权衡，而不能死板恪守教条。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-01-30 11:19 <a href="http://www.cppblog.com/oldworm/archive/2011/01/30/139610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一套网络框架的杯具</title><link>http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Wed, 26 Jan 2011 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139352.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139352.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139352.html</trackback:ping><description><![CDATA[
<p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="line-height: 21px; ">一套网络框架的杯具</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="line-height: 21px; ">之前设计了一套网络框架，持续改进了很多年，使用在很多项目上，综合效率还行，也很稳定，一直以来对这套东西信心满满，总以为啥问题都好解决，但最近就有个需求让我选择还是改了下这个框架。</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="line-height: 21px; ">之前的框架是这样的，可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程，可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个同步线程（默认</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">个），可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个异步线程（默认</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">个），可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个</span><span lang="EN-US" style="line-height: 21px; ">timer</span><span style="line-height: 21px; ">线程（默认</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">个），可以开一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个异步线程（默认</span><span lang="EN-US" style="line-height: 21px; ">cpu</span><span style="line-height: 21px; ">个），每组可独立受控，每组可支持自定义消息，可支持</span><span lang="EN-US" style="line-height: 21px; ">timer</span><span style="line-height: 21px; ">，一组</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">个如果</span><span lang="EN-US" style="line-height: 21px; ">N</span><span style="line-height: 21px; ">大于</span><span lang="EN-US" style="line-height: 21px; ">1</span><span style="line-height: 21px; ">则无法直接给这组里面的特定线程发消息，只能给一组发消息，这个组里面会选择某个合适的线程处理这个消息，这也是</span><span lang="EN-US" style="line-height: 21px; ">iocp</span><span style="line-height: 21px; ">高效和典型的用法了，但这也正是问题的结症所在。</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span lang="EN-US" style="line-height: 21px; ">Linux</span><span style="line-height: 21px; ">下的多线程服务器更常见的做法跟这个不大相似，一般都是将某些</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">分配到某些线程</span><span lang="EN-US" style="line-height: 21px; ">epoll</span><span style="line-height: 21px; ">，分好之后就是固定的，不再变化，跟</span><span lang="EN-US" style="line-height: 21px; ">Iocp</span><span style="line-height: 21px; ">将</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">绑定到一组线程的做法不同，由于某个</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">直接绑定到了某个线程，所以有些问题就变得简单了，如同一个连接的在同一个线程内消息进行了同步，要跟</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程绑定私有化数据也简单了，而且每个线程可独立受控，所以很容易实现一组</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">各自挂</span><span lang="EN-US" style="line-height: 21px; ">tls</span><span style="line-height: 21px; ">（线程局部存储）数据，而我现在做的这套框架就是这方面不好控了，其实也很难说这两种意义上的框架到底谁更优，如用在</span><span lang="EN-US" style="line-height: 21px; ">web</span><span style="line-height: 21px; ">型应用上这种</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">被一组</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程管理的模式很方便效率也高，但我现在的需求需要某个</span><span lang="EN-US" style="line-height: 21px; ">socket</span><span style="line-height: 21px; ">使用线程相关数据，以避免数据之间的锁，我用内存换时间，由于在原来的框架上增逻辑难以实现可直接控制</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程的框架的，所以花了一个晚上重新改写了一套框架，在原来</span><span lang="EN-US" style="line-height: 21px; ">iocpframe</span><span style="line-height: 21px; ">的基础上派生了一组带</span><span lang="EN-US" style="line-height: 21px; ">2</span><span style="line-height: 21px; ">名称的类，除替换类名之外只修改了几十行代码就做好了，总的来说花的时间还是比较少的。修改后</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程一组，但独立受控，外部可对这组线程中的某一个直接发消息，基本满足了需求，现在要给每个</span><span lang="EN-US" style="line-height: 21px; ">io</span><span style="line-height: 21px; ">线程绑定私有数据并触发特定消息比之前简单多了，而且绝对无锁。</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span lang="EN-US" style="line-height: 21px; ">&nbsp;</span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-01-26 16:14 <a href="http://www.cppblog.com/oldworm/archive/2011/01/26/139352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让后端服务器支持memcached协议</title><link>http://www.cppblog.com/oldworm/archive/2011/01/23/139168.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Sun, 23 Jan 2011 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/01/23/139168.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139168.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/01/23/139168.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139168.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139168.html</trackback:ping><description><![CDATA[
<p class="MsoNormal">&nbsp;</p>

<p class="MsoNormal" style="text-indent:21.0pt"><span style="font-family:宋体;
mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">由于原先的</span><span lang="EN-US">appserver</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">功能不断增多，最近又增了两个功能，需要不断从后端</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">中提取数据并进行计算，由于提取数据量大且频繁，导致效率很低，粗测了一下，获取数据和格式化等操作花了</span><span lang="EN-US">90%</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">以上的时间，由此设想将</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">改写或重写一个支持</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的服务器，将计算功能和</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">做到一起，让获取数据的路径最短，也就最大限度减少了数据传输和格式化等操作，就是类似存储过程一样啦，这部分可以考虑使用插件来实现，甚至可考虑使用脚本语言来实现。</span></p>

<p class="MsoNormal" style="text-indent:21.0pt"><span style="font-family:宋体;
mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">网上搜了一下，果然发现早有人这么干了，正所谓英雄所见啊，呵呵。具体方法倒很多，自定义</span><span lang="EN-US">key</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">命名，根据特殊</span><span lang="EN-US">key</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">在</span><span lang="EN-US">get</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">、</span><span lang="EN-US">set</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">、</span><span lang="EN-US">replace</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上做特殊操作，或者根据命令中的</span><span lang="EN-US">flag</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">等做特殊处理，或者扩充</span><span lang="EN-US">stat</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">命令等，都是可以的，我们暂时就考虑修改特殊的键值做特殊处理。</span></p>

<p class="MsoNormal" style="text-indent:21.0pt"><span style="font-family:宋体;
mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">要做一个完备的既支持</span><span lang="EN-US">ascii</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">命令又支持</span><span lang="EN-US">binary</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">命令的兼容</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">还是有一点点麻烦的，我暂时也没有太多需求，所以就仅支持了</span><span lang="EN-US">ascii</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">命令，其实也是考虑支持</span><span lang="EN-US">ascii</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的客户端更多，各种语言的支持</span><span lang="EN-US">mc</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的客户端数不胜数，但大多只支持</span><span lang="EN-US">ascii</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">命令。由于我之前为了测试服务器框架效率，做过一个支持</span><span lang="EN-US">ascii</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">命令的</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">兼容版本，因此拿过来直接使用太方便了，这个版本的实现其实很容易，如果有一个较好的框架代码的话基本上在一天之内可做完，当然要做到很好可能需要多花一些时间，我现在做的也不是特好，要完全取代</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">使用还是有些差距，主要是一些过期机制等没完全实现，虽然速度上比标准</span><span lang="EN-US">mc</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">版本还要快一点，呵呵，因为暂时的确是不需要这些过期机制，所以也没打算这个版本实现，其他功能基本上都有。</span></p>

<p class="MsoNormal" style="text-indent:21.0pt"><span style="font-family:宋体;
mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">以后准备将这个</span><span lang="EN-US">memcached</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">解码部分作为一个单独的解析器，和支持其他协议一样，换上这个解析那就支持</span><span lang="EN-US">mc</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">协议了，还是很方便的，以后有空还是要做个支持</span><span lang="EN-US">binary</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">协议的，以便可以更高效的解决问题。</span></p>

<p class="MsoNormal" style="text-indent:21.0pt"><span style="font-family:宋体;
mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin">想到</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">能支持</span><span lang="EN-US">Memcached</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:
Calibri;mso-hansi-theme-font:minor-latin">协议真是好啊，客户端基本只要用个</span><span lang="EN-US">libmemcached</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">就好了，多服务器分布，容错，多份数据啥的都有现成的解决方案，只要把</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">做稳定了就基本</span><span lang="EN-US">ok</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">了，对咱这种小团队来说再合适不过了，节省了很多开发维护成本啊，现在内存这么便宜，部署几个点实在是很</span><span lang="EN-US">easy</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的问题。</span></p>

<p class="MsoNormal" style="text-indent:21.0pt"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-01-23 17:13 <a href="http://www.cppblog.com/oldworm/archive/2011/01/23/139168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于内存数据库</title><link>http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Fri, 21 Jan 2011 05:37:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/139015.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/139015.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/139015.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>关于内存数据库</span></p>
<p>&nbsp;</p>
<p><span>最近要将一些数据放到内存里面做很高的并发操作，考虑了很多方案，</span></p>
<p><span><span>1、&nbsp;</span></span><span>简单点使用</span><span>map hash_map</span><span>等自己管理。</span></p>
<p><span><span>2、&nbsp;</span></span><span>用</span><span>sqlite</span><span>内存表。</span></p>
<p><span><span>3、&nbsp;</span></span><span>用</span><span>fastdb</span><span>内存数据库。</span></p>
<p><span><span>4、&nbsp;</span></span><span>用</span><span>ExtremeDb</span><span>，</span><span>TimesTen</span><span>等。</span></p>
<p><span>比较测试了一下</span><span>123</span><span>，发现还是自己实现速度最快，比</span><span>fastdb</span><span>模式快</span><span>3-5</span><span>倍，</span><span>fastdb</span><span>模式比</span><span>sqlite</span><span>内存表模式快</span><span>10</span><span>倍左右，由于自己实现不具有典型通用性，多线程下访问效率会下降，要管理多线程下各种更新查找等还是比较麻烦的，所以在</span><span>1</span><span>和</span><span>3</span><span>方案之间纠结。</span></p>
<p><span>为了使得决策更好一些，暂时还没做决定，顺便到万方等上面搜索了一些论文来看，看来看去看得真来气啊，虽然都叫内存数据库但各种实现的都有，有用</span><span>gdbm</span><span>来做的，有直接</span><span>map</span><span>管理的，有</span><span>hash</span><span>管理数据的，有</span><span>t</span><span>树管理的，有数组队列管理的，有的明显就是个不大变的东西还弄个啥事务的，靠，刚刚居然还看到一篇鸟文《电网监控系统实时数据库的设计与实现》里面的测试居然是</span><span>1000</span><span>条，插入时间</span><span>80</span><span>毫秒，真可笑啊，区区这么点数据也好意思测，还要花</span><span>80</span><span>毫秒，还自以为很快，这个速度至少可提高</span><span>1000</span><span>倍以上啊，这帮垃圾，写的啥鸟文章，研究个屁啊。</span></p>
<p><span>看完这十来篇论文，俺的思绪又回到</span><span>1999</span><span>年，当年我给别人优化过一个电信计费的软件（看的论文里面有好几篇讲电信计费的），当时有个朋友的朋友拿了个需求过来，</span><span>7000</span><span>万条记录，原来计算费单要花十几个小时吧，我帮他改了下，十来分钟就算完了，朋友很满意，当时的做法很简单，就是弄了个</span><span>mmtable</span><span>，大体就是跟</span><span>map</span><span>类似的东西吧，那个时候</span><span>map</span><span>还没流行起来，俺也不知道，所以就自己弄了个内存表，内部基本就是二分查找了，那个时候我对</span><span>hash</span><span>都不大熟悉，</span><span>B</span><span>树之类的算法刚接触也不会用，就这么个东西当时的电脑也只要花十来分钟，我估计就算是那个老程序放在现在的普通台式机上要不了几秒钟就可算完。也不知道这么几千万条记录的小需求怎么在这帮人眼里就成了什么海量数据，对俺来说跟玩似的，区区几千万嘛，不过是俺拿来测试用的。</span></p>
<p><span>去年中做了个</span><span>md5 hash</span><span>反查的东西，数据都是几百亿到几万亿的，后来的效果就是一个文件可存万亿记录，一次查询平均</span><span>1.2</span><span>次</span><span>IO</span><span>，即使全放在</span><span>SATA</span><span>磁盘上也就十来毫秒而已。</span></p>
<p><span>区区几千万条记录咋就叫什么海量数据呢，海量个毛啊，内存都放得下的叫什么海量，现在服务器动不动都是几十</span><span>G</span><span>内存，区区千万根本算不上什么，查询定位都可到微妙了，</span><span>1</span><span>秒插入至少千万条了，居然还看到</span><span>1000</span><span>条插入的测试，真是不得不佩服国内这帮垃圾研究生的水平，也不知道这种论文咋就能通过审查，只能得出结论他们的老师也都是猪。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>骂归骂自己的问题还需要继续努力，对咱目前的需求来说自己管理数据，即使一个线程都搞得定，因为不过区区几个表，几十万条记录而已，不过这种</span><span>10</span><span>年前咱就会的技术还真是拿不出手，怎么的也得做得更好一点，呵呵，继续研究吧，多线程下内存数据库，从概念上看的确是个很有吸引力的东西，要是性能跟得上，其实在很多地方可以取代普通的数据结构用法了，可以大大减少编程难度，甚至我在想如果有个支持事务的内存数据库，之前设计的</span><span>cad</span><span>类软件的</span><span>undo/redo</span><span>都可以用事务来实现，完全可以抛弃先前设计的复杂结构，其实这种东西即使不用内存数据库就算是用个</span><span>sqlite</span><span>都完全能搞定，唉，往事不堪回首啊，看来数据库方面的确得多花功夫，特别是多线程和分布式模式下的内存数据库。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/oldworm/aggbug/139015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-01-21 13:37 <a href="http://www.cppblog.com/oldworm/archive/2011/01/21/139015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近项目架构及协议决策</title><link>http://www.cppblog.com/oldworm/archive/2011/01/11/138330.html</link><dc:creator>袁斌</dc:creator><author>袁斌</author><pubDate>Tue, 11 Jan 2011 05:33:00 GMT</pubDate><guid>http://www.cppblog.com/oldworm/archive/2011/01/11/138330.html</guid><wfw:comment>http://www.cppblog.com/oldworm/comments/138330.html</wfw:comment><comments>http://www.cppblog.com/oldworm/archive/2011/01/11/138330.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/oldworm/comments/commentRss/138330.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oldworm/services/trackbacks/138330.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">最近给自己换了个老板，忙了一段时间，所以有几个月没写博客，今后还是要争取多写啊，呵呵。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">换来新地方，第一件大的事情就是修改后端架构和通信协议，架构也设计得很普通，因为这边的业务不需要太过复杂的后端，所以就简单设计了一下，基本是参照</span><span lang="EN-US">web</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的模型，符合我一贯的向</span><span lang="EN-US">web</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">学习的思想，弄了个</span><span lang="EN-US">gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">管理入口，相当于</span><span lang="EN-US">web</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">下的</span><span lang="EN-US">webserver</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，后端其他服务器挂在该</span><span lang="EN-US">gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">下，相当于</span><span lang="EN-US">web</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">模型下的</span><span lang="EN-US">appserver</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，或者</span><span lang="EN-US">fastcgi</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">模型的</span><span lang="EN-US">fastcgi</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">进程，</span><span lang="EN-US">gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上管理连接、合法性检测、登录、加密、压缩、缓存。</span><span lang="EN-US">Gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">和后端通信本来想参照</span><span lang="EN-US">fastcgi</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">协议，但看了之后觉得</span><span lang="EN-US">fastcgi</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">协议还是复杂了，所以就设计了一个更简单的协议，</span><span lang="EN-US">gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">和后端</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">之间可传递</span><span lang="EN-US">key:value</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">型数据对，</span><span lang="EN-US">value</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">不局限于字符串，可以是任意数据，这样基本满足了当前的需求，第一版放上去之后也运行良好，到今天也基本持续稳定运行快一个月了，没出过什么事情。由于在</span><span lang="EN-US">gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">这边缓冲了</span><span lang="EN-US">job</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">管理，所以后端</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">升级很方便，随时可关闭更新，</span><span lang="EN-US">gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">会在窗口时间内将未执行完成的任务重新提交，有此功能可放心大胆的升级后端，这个月这样的工作做了几次，在架构修改之前这样的事情几乎是不敢做的，因为一旦升级所有用户全部断开连接，而现在用户则基本无感觉。</span><span lang="EN-US">Gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上的缓存层为后端减少了一些压力，这个缓存是按照请求的</span><span lang="EN-US">md5</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">为</span><span lang="EN-US">key</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">做的，并根据协议配置时效，有此</span><span lang="EN-US">cache</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">后端大多数服务可不设计缓存或降低缓存设计的复杂度。</span><span lang="EN-US">Gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上针对敏感数据统一做了加密处理，主要是辛辛苦苦整理的数据不能轻易让竞争对手窃去了，呵呵。</span><span lang="EN-US">Gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">也做了压缩，现在是针对</span><span lang="EN-US">&gt;=128</span><span style="font-family:宋体;mso-ascii-font-family:
Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">长度的包进行压缩，使用了</span><span lang="EN-US">qlz</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，压缩效率还是很不错的，速度很快。目前</span><span lang="EN-US">gate</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">后端挂接的既有</span><span lang="EN-US">win</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上的</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">也有</span><span lang="EN-US">linux</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">上的</span><span lang="EN-US">server</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，这是一开始就这么规划的，现在看来当初的目的达到了，混合发挥各自的优势，有的项目在原有系统上跑得好好的，没必要重新开发嘛。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">协议设计上本来我是计划二进制混合</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">格式，以二进制为主，但尝试了一个协议之后发现，这边的小伙子们对直接操纵内存普遍技术不过关，他们大多是从</span><span lang="EN-US">java</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">开始的，后来才学习</span><span lang="EN-US">c</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">，对字符串用得很熟练，权衡之下采用了</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">为主，混合二进制为辅的方案，这样修改之后的协议和他们之前使用的</span><span lang="EN-US">xml</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">类似，就是更小更紧凑一点，使用方法上很类似，从现在的效果看还行，使用</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">格式为主的协议当然不能跟使用</span><span lang="EN-US">pb</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">之类的相比，解析效率上大约单线程每秒解析</span><span lang="EN-US">20</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">来万</span><span lang="EN-US">10</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">个</span><span lang="EN-US">obj</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的对象，速度上不算太快但也不算太慢，对付一秒至多几万数据包的应用来说还是够的，因为现在</span><span lang="EN-US">cpu</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">计算能力普遍过剩，使用</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的另个好处就是增删字段很方便，各个版本之间不需要太考虑版本的问题，要是全用二进制格式就要麻烦很多了，在使用压缩之后，目前的</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">格式协议比之前的</span><span lang="EN-US">xml</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">协议减少了</span><span lang="EN-US">2/3</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">的带宽使用，总体效果还是可以的。使用</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">调试也很方便，我提供了一个工具，写后端的就直接用该工具按照</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">格式收发数据，无需等</span><span lang="EN-US">client</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">开发好了再去做后端，之后做</span><span lang="EN-US">client</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">也很方便，请求发过去之后返回来的就是标准的</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">格式数据，同样的解析方法，每个不同的应用就按照不同的格式处理下即可，和</span><span lang="EN-US">web</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">等模块交互也很方便，这可算是额外的好处了。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">总之，虽然</span><span lang="EN-US">json</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">格式存储效率和解析效率跟二进制方式还差半个量级到一个量级，但合理使用还是可以的，特别是跟</span><span lang="EN-US">xml</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">相比优势很明显，权衡使用吧，当然追求极致效率可能还是用</span><span lang="EN-US">pb</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">之类的更合适一些，或者自己设计</span><span lang="EN-US">tlv</span><span style="font-family:宋体;mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:
minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin">格式。</span></p>

<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/oldworm/aggbug/138330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oldworm/" target="_blank">袁斌</a> 2011-01-11 13:33 <a href="http://www.cppblog.com/oldworm/archive/2011/01/11/138330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>