• <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

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

            Ragel State Machine Compiler

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

             

            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;

            };

             

            生成的基于狀態(tài)機(jī)的代碼,比c里面那500多行實(shí)現(xiàn)的atoi函數(shù)更加高效。比如上面這段代碼,會生成下面的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里面花了好幾百行來實(shí)現(xiàn)HTTP協(xié)議的解析,用Ragel100多行就可以搞定了,效率更高,人肉優(yōu)化器不值錢了(參見網(wǎng)址上面的 http11_parser.rl 代碼)

             

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

             

            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 代碼,編譯運(yùn)行,結(jié)果是:

             

            27750

            30938

             

            可見生成的代碼比那簡單實(shí)現(xiàn)的更高:)

             

            RoR架構(gòu)上面使用的Mongrel服務(wù)器,原來也是使用了Ragel

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

            評論

            # re: Ragel State Machine Compiler  回復(fù)  更多評論   

            大哥,這個Ragel我很想入門,但官方的pdf看不懂啊。可以詳細(xì)解釋一下“判斷Java String是否為數(shù)字串”這個例子嗎?我連這個例子都看不懂……先謝謝了。
            2009-06-24 20:54 | lizhang2009
            久久综合综合久久狠狠狠97色88| 人妻无码中文久久久久专区| 亚洲va久久久噜噜噜久久狠狠 | 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲精品高清一二区久久 | 免费一级欧美大片久久网| 国产日产久久高清欧美一区| 久久久免费精品re6| 亚洲∧v久久久无码精品| 亚洲精品无码专区久久久| 国产成人精品综合久久久久| 精品久久人人爽天天玩人人妻| 伊人久久五月天| 久久精品综合网| 久久久久亚洲AV片无码下载蜜桃 | 久久人人爽人人爽人人片AV不| 欧美精品乱码99久久蜜桃| 国产欧美久久久精品影院| 久久久久精品国产亚洲AV无码| 亚洲精品乱码久久久久久按摩 | 99久久国产精品免费一区二区 | 国产精品久久久久天天影视| 99国产精品久久| 狠狠色伊人久久精品综合网| 久久亚洲AV永久无码精品| 超级碰碰碰碰97久久久久| 日产精品久久久久久久| 色综合久久综精品| 亚洲国产成人精品无码久久久久久综合 | 午夜精品久久久久久久| 久久久精品午夜免费不卡| 久久影院亚洲一区| 亚洲AV无码久久精品蜜桃| 久久91亚洲人成电影网站| 久久久久亚洲精品无码网址| 中文字幕无码免费久久| 99久久精品国产免看国产一区| 久久精品这里只有精99品| 亚洲中文字幕无码一久久区| 伊人丁香狠狠色综合久久| 国产亚洲美女精品久久久2020|