• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            Ragel State Machine Compiler

            老魚頭昨天向俺們推薦了 Ragel State Machine Compiler 這個東東,一個可以生成協議處理代碼的工具。還舉了個例子,簡簡單單的幾行代碼:

             

            int atoi( char *str )

            {

             char *p = str;

             int cs, val = 0;

             bool neg = false;

             

             %%{

              action see_neg {

               neg = true;

              }

             

              action add_digit {

               val = val * 10 + (fc - '0');

              }

             

              main :=

               ( '-'@see_neg | '+' )? ( digit @add_digit )+

               '\n' @{ fbreak; };

             

              # Initialize and execute.

              write init;

              write exec noend;

             }%%

             

             if ( neg )

              val = -1 * val;

             

             if ( cs < atoi_first_final )

              cerr << "atoi: there was an error" << endl;

             

             return val;

            };

             

            生成的基于狀態機的代碼,比c里面那500多行實現的atoi函數更加高效。比如上面這段代碼,會生成下面的c代碼:

             

            int atoi( char *str )

            {

             char *p = str;

             int cs, val = 0;

             bool neg = false;

             

             

            #line 27 "atoi.c"

             {

             cs = atoi_start;

             }

             

            #line 31 "atoi.c"

             {

             switch ( cs )

             {

            case 1:

             switch( (*p) ) {

              case 43: goto st2;

              case 45: goto tr2;

             }

             if ( 48 <= (*p) && (*p) <= 57 )

              goto tr3;

             goto st0;

            st0:

             goto _out0;

            tr2:

            #line 23 "atoi.rl"

             {

               neg = true;

              }

             goto st2;

            st2:

             p += 1;

            case 2:

            #line 52 "atoi.c"

             if ( 48 <= (*p) && (*p) <= 57 )

              goto tr3;

             goto st0;

            tr3:

            #line 27 "atoi.rl"

             {

               val = val * 10 + ((*p) - '0');

              }

             goto st3;

            st3:

             p += 1;

            case 3:

            #line 63 "atoi.c"

             if ( (*p) == 10 )

              goto tr4;

             if ( 48 <= (*p) && (*p) <= 57 )

              goto tr3;

             goto st0;

            tr4:

            #line 33 "atoi.rl"

             { goto _out4; }

             goto st4;

            st4:

             p += 1;

            case 4:

            #line 74 "atoi.c"

             goto st0;

             }

             _out0: cs = 0; goto _out;

             _out4: cs = 4; goto _out;

             

             _out: {}

             }

            #line 38 "atoi.rl"

             

             

             if ( neg )

              val = -1 * val;

             

             if ( cs < atoi_first_final )

              cerr << "atoi: there was an error" << endl;

             

             return val;

            };

             

             

             

            他說,Nginx里面花了好幾百行來實現HTTP協議的解析,用Ragel100多行就可以搞定了,效率更高,人肉優化器不值錢了(參見網址上面的 http11_parser.rl 代碼)

             

            今天試了一下,用來寫一個判斷一個Java String是否為數字串:

             

            public class IsInt

            {

             

            %%{

             machine is_int;

             write data noerror;

            }%%

             

             public static void main(String[] args)

             {

              long begin = System.currentTimeMillis();

              for (int i=0; i<100000000; i++) {

                  isIntStr("123456789p");

               isIntStr("8487389247");

              }

              System.out.println(System.currentTimeMillis() - begin);

             

              begin = System.currentTimeMillis();

              for (int i=0; i<100000000; i++) {

                  isAllNumber("123456789p");

               isAllNumber("8487389247");

              }

              System.out.println(System.currentTimeMillis() - begin);

             }

             

             public static boolean isAllNumber(String str)  

             {   

              char[] c = str.toCharArray();

              boolean blReturn = true;  

              for(int ni=0; ni<c.length; ni++)  

              {  

               if(c[ni]<48 || c[ni]>57)

               {  

                blReturn = false; 

                break;

               }

              }

              return blReturn;  

             }

             

             public static boolean isIntStr(String str)

             {

              char[] data = str.toCharArray();

              int p=0, cs=0;

              boolean isInt = true;

             

              %%{

               main := (digit+)? any @{ isInt = false; fbreak; };

             

               write init;

               write exec noend;

              }%%

             

              return isInt;

             }

            }

             

             

             

            使用 ragel.exe -J IsInt.rl | rlgen-java.exe 命令生成 java 代碼,編譯運行,結果是:

             

            27750

            30938

             

            可見生成的代碼比那簡單實現的更高:)

             

            RoR架構上面使用的Mongrel服務器,原來也是使用了Ragel

            posted on 2008-12-24 14:58 肥仔 閱讀(2960) 評論(1)  編輯 收藏 引用 所屬分類: 狀態機 & 自動機 & 形式語言

            評論

            # re: Ragel State Machine Compiler  回復  更多評論   

            大哥,這個Ragel我很想入門,但官方的pdf看不懂啊。可以詳細解釋一下“判斷Java String是否為數字串”這個例子嗎?我連這個例子都看不懂……先謝謝了。
            2009-06-24 20:54 | lizhang2009
            亚洲狠狠综合久久| 亚洲精品无码专区久久久 | 亚洲午夜精品久久久久久浪潮| 国产L精品国产亚洲区久久| 久久午夜福利电影| 看久久久久久a级毛片| 亚洲综合久久综合激情久久| 亚洲午夜久久久| 99re久久精品国产首页2020| 亚洲国产成人精品91久久久| 欧美激情一区二区久久久| 久久久无码人妻精品无码| 久久一区二区三区免费| 青青草原精品99久久精品66| 久久99精品久久久久久齐齐| 欧洲精品久久久av无码电影| 久久精品国产99久久久香蕉| 久久精品国产亚洲av麻豆色欲| 伊人久久亚洲综合影院| 91久久九九无码成人网站| 久久国产色AV免费看| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久精品国产男包| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久亚洲国产午夜精品理论片| 久久中文字幕人妻熟av女| 精品熟女少妇aⅴ免费久久| 久久se精品一区二区| 国产情侣久久久久aⅴ免费| 人妻久久久一区二区三区| 狠狠色丁香久久婷婷综合蜜芽五月| 久久久久99精品成人片牛牛影视| 国产精品久久久久久福利69堂| 亚洲国产精品无码久久久不卡| 国产成人综合久久精品红| 综合久久精品色| 久久99久国产麻精品66| 久久久久久久久久久久久久| 久久久高清免费视频| 日产精品久久久久久久| 欧美成人免费观看久久|