- ragel-6.10编译安装
一路向后
本次安装基于系统CentOSLinuxrelease6.0(Final)1.软件介绍Ragel是个有限状态机编译器,它将基于正则表达式的状态机编译成传统语言(C,C++,D,Java,Ruby等)的解析器。用Ragel可以很方便且很容易的写出各种FSM,也经常用作语法检测器。2.下载源码官网地址:http://www.colm.net/open-source/ragel/3.解压源码$tarzxv
- suricata mysql_Suricata启用Hyperscan支持以及Prelude-siem安装方法.md
木子淇
suricatamysql
#Suricata启用Hyperscan支持以及Prelude-siem安装方法##0x01安装Hyperscan###1、Hyperscan安装要求:*GCC版本大于等于4.8.1,使用yum源安装即可*CMake版本大于等于2.8.11,使用yum源安装即可*Ragel版本大于等于6.9,使用yum源安装即可*Python版本为2.7,使用系统默认的*Boost版本大于等于1.57,Boost
- Hyperscan 安装
耿小渣
linux
源码下载Ragel:http://www.colm.net/files/ragel/ragel-6.9.tar.gzboost:http://downloads.sourceforge.net/project/boost/boost/1.60.0/boost_1_60_0.tar.gzhyperscan:https://download.csdn.net/download/u014608280/1
- ubuntu20.04下源码安装hyperscan库安装记录
sa726663676
vmware虚拟机linux运维服务器
安装测试环境:vmware-ubuntu20.04,gcc4.8.5,ragel-6.10.tar.gz,boost_1_69_0.tar.gz,hyperscan-5.1.0.tar.gz1.安装ragel(必须的依赖包)1MB:下载地址:http://www.colm.net/files/ragel/ragel-6.10.tar.gz$tar-xvfragel-6.10.tar.gz$cdra
- ragel 解析http 响应
山有木兮啊
c/c++httpc++网络协议
/*************************************************************************>FileName:http_response_parser.h>Author:eular>Brief:>CreatedTime:Sun06Feb202211:08:08PMCST************************************
- ragel 解析http 请求
山有木兮啊
c/c++httpsafarijavascript
httprequest"GEThttps://www.cnblogs.com/templets/new/script/jquery.snippet.jsHTTP/1.1\r\n""Host:c.biancheng.net\r\n""Proxy-Connection:keep-alive\r\n""Pragma:no-cache\r\n""Cache-Control:no-cache\r\n""Ac
- ragel解析http url
山有木兮啊
c/c++http网络协议网络
#include#includeusingnamespacestd;%%{#SeeRFC3986:http://www.ietf.org/rfc/rfc3986.txtmachineuri_parser;gen_delims=":"|"/"|"?"|"#"|"["|"]"|"@";sub_delims="!"|"$"|"&"|"'"|"("|")"|"*"|"+"|","|";"|"=";rese
- Ragel学习笔记(一)
winux
脚本C++编程
Ragel是一个状态机编译器,类似Lex,主要是用来处理字符输入,用于语法解析。简单的文本处理工作一般用正则表达式,或者用awk/sed这些工具就可以处理。之所以用Ragel是为了这样的场景,你的代码的核心任务是解析文本,而且需要高效的处理,比如一个SMTP引擎,HTTP引擎。那么Ragel可以按你定义好的语法,生成一个状态机嵌入到你的代码中。因为这个状态机是专门针对你预定义的语法,且以你的原生代
- 类似这种问题解决方法 version `CXXABI_1.3.8' not found (required by ragel)'
瓜枣三郎
version`GLIBCXX_3.4.14'notfound两者是一个问题导致的:c++标准库太老了.没有更新.找到源码安装gcc的目录(gcc编译器最好还是源码安装)先find出libstdc++.so.6.0.22(我的是22)如果不是源码安装就从根目录找find/-name"libstdc++.so*"把它拷到/usr/lib64下删掉libstdc++.so.6这个软连接.rm-rfli
- ragel学习资源整合
banzongyue9312
近期做脚本检测的项目,使用ragel,因为之前没有接触,所以整理了一些资源ragel官网资源http://www.complang.org/ragel/http://en.wikipedia.org/wiki/Ragel增则表达式入门http://deerchao.net/tutorials/regex/regex.htm增则表达式网上测试工具https://www.regexpal.com/re
- Ragel入门1——简介
a13393665983
Ragel入门1——简介http://blog.dccmx.com/2011/01/ragel-intro-1/Ragel入门1——简介dccmx于2011年一月3日发表|最后修改于2011年一月10日Ragel是个好东西啊,很好很强大。它是什么?它是个“状态机编译器”,就是说那是用来从某定义编译出状态机的工具。其实它是个很好很强大的基于正则表达式和状态机的超级词法分析器。我们可以用它来生成强大的
- Ragel——基于有限状态机用于产生源码的编译器
firo_baidu
ETC
Reference:http://www.complang.org/ragel/offcialsitehttp://en.wikipedia.org/wiki/RagelRagel入门WhatisRagel?Ragelisafinite-statemachinecompilerwithoutputsupportforC,C++,C#,Objective-C,D,Java,GoandRubysour
- hyperscan 学习-跨包检测
庞叶蒙
DPDK学习
0x01编译和安装:http://www.colm.net/files/ragel/ragel-6.10.tar.gzgitclonegit://github/01org/hyperscanGCC,v4.8.1orhigherClang,v3.4orhigher(withlibstdc++orlibc++)IntelC++Compilerv15orhigherDependencyVersionNo
- VLC编译踩过的坑
无边小猪
如果在编译工具安装阶段编不过,请相信代码没有问题,问题基本都是编译环境的。反复尝试都编译不过可以使用以下办法:环境需要安装以下工具:autoconf,automake,m4,libtool,pkg-config,cmake,ragel,protoc,ant,xz哪个没有或者版本过高过低都会出错,却少的会在编译一开始列出,如:autoconfnotfindanttooold…可以尝试以下办法自行安装
- msys2+mingw64+ragel安装
或许就在眼前丶
[msys2+mingw64+ragel安装][简介]这几天部门老大让解析几个东西,要求用ragel编写,在Windows环境下,要运用到mingw64,安装时发现mingw里没有pacman,需要现安装,然后发现Wget也没有。。。,所以改使用msys2。安装过程比较曲折,发生各种问题。也查了一堆资料文档,好在最后都解决了。特在此整理一下,以便记忆。首先介绍一下这几个东西:msys2是msys升
- Ragel State Machine Compiler 的速度测试
vevenlcf
ragel
据说Ragel生成的自动机程序,速度飞快,特地测试了一下,所得结果如下。 测试环境: VC6+Release下编译测试规模: 一亿次测试用例: Ragel编译r_atoi.rl文件 vs crtlib的 atoi函数测试结果:Ragel的编译选项时间(毫秒)crtlib 的atoi5218-T031500-T126328-F017797-F113578-G013203
- Ragel入门1——简介
入门
http://blog.dccmx.com/2011/01/ragel-intro-1/Ragel入门1——简介dccmx于2011年一月3日发表|最后修改于2011年一月10日Ragel是个好东西啊,很好很强大。它是什么?它是个“状态机编译器”,就是说那是用来从某定义编译出状态机的工具。其实它是个很好很强大的基于正则表达式和状态机的超级词法分析器。我们可以用它来生成强大的词法分析器,用来分析诸如
- Ragel——基于有限状态机用于产生源码的编译器
firo_baidu
正则表达式Flexgccreference编译器output
Reference:http://www.complang.org/ragel/ offcialsitehttp://en.wikipedia.org/wiki/Ragel Ragel入门 WhatisRagel?Ragel isa finite-statemachine compiler withoutputsupportfor C, C++, C#, Objective-C, D, Java,
- TextMate伴侣 Ackmate
夜鸣猪
xcodeRuby
ackmate是Textmate的协助搜索工具,比自带的要强大很多也经常用,收集回来。猛推一下下载这里一些小配置
#~/.ackrc
--type-add=objc=.pch
--type-set=xcode=.pbxproj,.pbxuser,.perspectivev3
--type-set=ragel=.rl
--type-set=nib=.xib
--type-set=plis
- 让ragel可以使用扩展ascii码
woaidongmao
让ragel可以使用扩展ascii码%%{ machinedecode_object; writedata; alphtypeunsignedchar;}%%booldecode_object(unsignedchar*decode_data,intlen){ intcontent_type=0; unsignedchar*p=str,*pe=decode_data+len,*
- yacc&lex 的erlang版本
mryufeng
erlang
曾经花了很多时间折腾编译原理,大部分的程序不是字符串处理就是文法和语法分析,这个技术对于提高技术素质非常帮助。想起来折腾了lex yacc boost spirt lpeg lemon ragel leex yecc。 这些名词的背后是不同的语言 不同的平台 不同的思想的东西。 从上个版本erlang添加了leex以后,我非常渴望能够把它用于实际项目中去, 准备多花点时间在上面, 有兴趣的同学一起
- Ragel State Machine Compiler 的速度测试
woaidongmao
RagelStateMachineCompiler的速度测试据说Ragel生成的自动机程序,速度飞快,特地测试了一下,所得结果如下。 测试环境: VC6+Release下编译测试规模: 一亿次测试用例: Ragel编译r_atoi.rl文件vscrtlib的atoi函数测试结果:Ragel的编译选项时间(毫秒)crtlib的atoi5218-T031500-T126328-
- Ragel man page(英)
woaidongmao
Ragelmanpage(英)ragel-compileregularlanguagesintoexecutablestatemachinesSynopsisragel[options]fileDescriptionRagelcompilesexecutablefinitestatemachinesfromregularlanguages.RagelcangenerateC,C++,Objecti
- #line 宏
woaidongmao
#line宏用来重新设定源文件的名字和行号,指向另外的一个地方,如果出现编译错误,编译器的输出信息将指向设置后的文件和偏移,LEX&YACC,Ragel,很多这种宏。 MSDN的解释The#linedirectivetellsthepreprocessortochangethecompiler’sinternallystoredlinenumberandfilenametoagivenlinenu
- Ragel 状态机简介
woaidongmao
Ragel状态机简介从今天开始我把我前一段时间用到的状态机工具Ragel的使用方法做一些总结,希望大家斧正!(如果大家对状态机概念有模糊的话,请参考>一书,基本上有详尽的介绍)好闲言少叙,言归正传Ragel可以从正规表达式生成可执行有限状态机,它可以生成C,C++,Object-C,D,Java和Ruby可执行代码官方网站:http://www.cs.queensu.ca/home/thursto
- Ragel State Machine Compiler
woaidongmao
RagelStateMachineCompiler老鱼头昨天向俺们推荐了RagelStateMachineCompiler这个东东,一个可以生成协议处理代码的工具。还举了个例子,简简单单的几行代码: intatoi(char*str){ char*p=str; intcs,val=0; boolneg=false; %%{ actionsee_neg{ neg=true; } actiona
- Ragel状态机生成器
woaidongmao
Ragel状态机生成器Ragel可以把正则表达式翻译成有限状态机(FA)的各种语言表示,包括C、C++、Objective-C、D、Java和Ruby。RegularExpression和FA的用途很广,可以用于协议分析、数据解析、词法分析、用户数据校验等。在Ragel的帮助下,写一个atoi的函数非常容易,而且比标准库提供的atoi函数性能要高。/**Convertastringtoaninte
- lighty2.0沙箱版本的协议和配置分析采用ragel 成功案例
mryufeng
sqliteFlexGooglelighttpdlua
今天发现lighty2.0的 url, config, httprequest 全部用ragel。 ragel http://www.complang.org/ragel/
这个东西我去年的时候非常兴趣. 用它写的atoi函数比标准库的快了好几倍,有点不可思议,主要是它产生的代码大量根据编译器的特点做了大量的优化。 从此以后协议分析告别手工时代,步入机械化生产。
类似的工具有lex/y
- Thin:更快的Ruby Web服务器
Sebastien Auvray
现在Mongrel已经成了RubyWeb服务器的默认选择(参见ZedShaw在QConLondon2007上的演讲:creatorofMongrel)。但是一个叫做Thin的新的试验性的解决方案目前已经可以使用。Thin将以下三个Ruby的Web库整合在了一起:Mongrelparser,(使用Ragel)Mongrel速度与安全性的基础。EventMachine,一个简单的事件处理Ruby库,用
- jvm调优总结(从基本概念 到 深度优化)
oloz
javajvmjdk虚拟机应用服务器
JVM参数详解:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。
- 【Scala十六】Scala核心十:柯里化函数
bit1129
scala
本篇文章重点说明什么是函数柯里化,这个语法现象的背后动机是什么,有什么样的应用场景,以及与部分应用函数(Partial Applied Function)之间的联系 1. 什么是柯里化函数
A way to write functions with multiple parameter lists. For instance
def f(x: Int)(y: Int) is a
- HashMap
dalan_123
java
HashMap在java中对很多人来说都是熟的;基于hash表的map接口的非同步实现。允许使用null和null键;同时不能保证元素的顺序;也就是从来都不保证其中的元素的顺序恒久不变。
1、数据结构
在java中,最基本的数据结构无外乎:数组 和 引用(指针),所有的数据结构都可以用这两个来构造,HashMap也不例外,归根到底HashMap就是一个链表散列的数据
- Java Swing如何实时刷新JTextArea,以显示刚才加append的内容
周凡杨
java更新swingJTextArea
在代码中执行完textArea.append("message")后,如果你想让这个更新立刻显示在界面上而不是等swing的主线程返回后刷新,我们一般会在该语句后调用textArea.invalidate()和textArea.repaint()。
问题是这个方法并不能有任何效果,textArea的内容没有任何变化,这或许是swing的一个bug,有一个笨拙的办法可以实现
- servlet或struts的Action处理ajax请求
g21121
servlet
其实处理ajax的请求非常简单,直接看代码就行了:
//如果用的是struts
//HttpServletResponse response = ServletActionContext.getResponse();
// 设置输出为文字流
response.setContentType("text/plain");
// 设置字符集
res
- FineReport的公式编辑框的语法简介
老A不折腾
finereport公式总结
FINEREPORT用到公式的地方非常多,单元格(以=开头的便被解析为公式),条件显示,数据字典,报表填报属性值定义,图表标题,轴定义,页眉页脚,甚至单元格的其他属性中的鼠标悬浮提示内容都可以写公式。
简单的说下自己感觉的公式要注意的几个地方:
1.if语句语法刚接触感觉比较奇怪,if(条件式子,值1,值2),if可以嵌套,if(条件式子1,值1,if(条件式子2,值2,值3)
- linux mysql 数据库乱码的解决办法
墙头上一根草
linuxmysql数据库乱码
linux 上mysql数据库区分大小写的配置
lower_case_table_names=1 1-不区分大小写 0-区分大小写
修改/etc/my.cnf 具体的修改内容如下:
[client]
default-character-set=utf8
[mysqld]
datadir=/var/lib/mysql
socket=/va
- 我的spring学习笔记6-ApplicationContext实例化的参数兼容思想
aijuans
Spring 3
ApplicationContext能读取多个Bean定义文件,方法是:
ApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[]{“bean-config1.xml”,“bean-config2.xml”,“bean-config3.xml”,“bean-config4.xml
- mysql 基准测试之sysbench
annan211
基准测试mysql基准测试MySQL测试sysbench
1 执行如下命令,安装sysbench-0.5:
tar xzvf sysbench-0.5.tar.gz
cd sysbench-0.5
chmod +x autogen.sh
./autogen.sh
./configure --with-mysql --with-mysql-includes=/usr/local/mysql
- sql的复杂查询使用案列与技巧
百合不是茶
oraclesql函数数据分页合并查询
本片博客使用的数据库表是oracle中的scott用户表;
------------------- 自然连接查询
查询 smith 的上司(两种方法)
&
- 深入学习Thread类
bijian1013
javathread多线程java多线程
一. 线程的名字
下面来看一下Thread类的name属性,它的类型是String。它其实就是线程的名字。在Thread类中,有String getName()和void setName(String)两个方法用来设置和获取这个属性的值。
同时,Thr
- JSON串转换成Map以及如何转换到对应的数据类型
bijian1013
javafastjsonnet.sf.json
在实际开发中,难免会碰到JSON串转换成Map的情况,下面来看看这方面的实例。另外,由于fastjson只支持JDK1.5及以上版本,因此在JDK1.4的项目中可以采用net.sf.json来处理。
一.fastjson实例
JsonUtil.java
package com.study;
impor
- 【RPC框架HttpInvoker一】HttpInvoker:Spring自带RPC框架
bit1129
spring
HttpInvoker是Spring原生的RPC调用框架,HttpInvoker同Burlap和Hessian一样,提供了一致的服务Exporter以及客户端的服务代理工厂Bean,这篇文章主要是复制粘贴了Hessian与Spring集成一文,【RPC框架Hessian四】Hessian与Spring集成
在
【RPC框架Hessian二】Hessian 对象序列化和反序列化一文中
- 【Mahout二】基于Mahout CBayes算法的20newsgroup的脚本分析
bit1129
Mahout
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information re
- nginx三种获取用户真实ip的方法
ronin47
随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户的真实IP地址,如果后端是apache,请跳转到<apache获取用户真实IP地址>,如果是后端真实服务器是nginx,那么继续往下看。
实例环境: 用户IP 120.22.11.11
- java-判断二叉树是不是平衡
bylijinnan
java
参考了
http://zhedahht.blog.163.com/blog/static/25411174201142733927831/
但是用java来实现有一个问题。
由于Java无法像C那样“传递参数的地址,函数返回时能得到参数的值”,唯有新建一个辅助类:AuxClass
import ljn.help.*;
public class BalancedBTree {
- BeanUtils.copyProperties VS PropertyUtils.copyProperties
诸葛不亮
PropertyUtilsBeanUtils
BeanUtils.copyProperties VS PropertyUtils.copyProperties
作为两个bean属性copy的工具类,他们被广泛使用,同时也很容易误用,给人造成困然;比如:昨天发现同事在使用BeanUtils.copyProperties copy有integer类型属性的bean时,没有考虑到会将null转换为0,而后面的业
- [金融与信息安全]最简单的数据结构最安全
comsci
数据结构
现在最流行的数据库的数据存储文件都具有复杂的文件头格式,用操作系统的记事本软件是无法正常浏览的,这样的情况会有什么问题呢?
从信息安全的角度来看,如果我们数据库系统仅仅把这种格式的数据文件做异地备份,如果相同版本的所有数据库管理系统都同时被攻击,那么
- vi区段删除
Cwind
linuxvi区段删除
区段删除是编辑和分析一些冗长的配置文件或日志文件时比较常用的操作。简记下vi区段删除要点备忘。
vi概述
引文中并未将末行模式单独列为一种模式。单不单列并不重要,能区分命令模式与末行模式即可。
vi区段删除步骤:
1. 在末行模式下使用:set nu显示行号
非必须,随光标移动vi右下角也会显示行号,能够正确找到并记录删除开始行
- 清除tomcat缓存的方法总结
dashuaifu
tomcat缓存
用tomcat容器,大家可能会发现这样的问题,修改jsp文件后,但用IE打开 依然是以前的Jsp的页面。
出现这种现象的原因主要是tomcat缓存的原因。
解决办法如下:
在jsp文件头加上
<meta http-equiv="Expires" content="0"> <meta http-equiv="kiben&qu
- 不要盲目的在项目中使用LESS CSS
dcj3sjt126com
Webless
如果你还不知道LESS CSS是什么东西,可以看一下这篇文章,是我一朋友写给新人看的《CSS——LESS》
不可否认,LESS CSS是个强大的工具,它弥补了css没有变量、无法运算等一些“先天缺陷”,但它似乎给我一种错觉,就是为了功能而实现功能。
比如它的引用功能
?
.rounded_corners{
- [入门]更上一层楼
dcj3sjt126com
PHPyii2
更上一层楼
通篇阅读完整个“入门”部分,你就完成了一个完整 Yii 应用的创建。在此过程中你学到了如何实现一些常用功能,例如通过 HTML 表单从用户那获取数据,从数据库中获取数据并以分页形式显示。你还学到了如何通过 Gii 去自动生成代码。使用 Gii 生成代码把 Web 开发中多数繁杂的过程转化为仅仅填写几个表单就行。
本章将介绍一些有助于更好使用 Yii 的资源:
- Apache HttpClient使用详解
eksliang
httpclienthttp协议
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会
- zxing二维码扫描功能
gundumw100
androidzxing
经常要用到二维码扫描功能
现给出示例代码
import com.google.zxing.WriterException;
import com.zxing.activity.CaptureActivity;
import com.zxing.encoding.EncodingHandler;
import android.app.Activity;
import an
- 纯HTML+CSS带说明的黄色导航菜单
ini
htmlWebhtml5csshovertree
HoverTree带说明的CSS菜单:纯HTML+CSS结构链接带说明的黄色导航
在线体验效果:http://hovertree.com/texiao/css/1.htm代码如下,保存到HTML文件可以看到效果:
<!DOCTYPE html >
<html >
<head>
<title>HoverTree
- fastjson初始化对性能的影响
kane_xie
fastjson序列化
之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营。对比了jackson,gson等框架之后,决定用fastjson,为什么呢,因为看名字感觉很快。。。
网上的说法:
fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。
- 基于Mybatis封装的增删改查实现通用自动化sql
mengqingyu
DAO
1.基于map或javaBean的增删改查可实现不写dao接口和实现类以及xml,有效的提高开发速度。
2.支持自定义注解包括主键生成、列重复验证、列名、表名等
3.支持批量插入、批量更新、批量删除
<bean id="dynamicSqlSessionTemplate" class="com.mqy.mybatis.support.Dynamic
- js控制input输入框的方法封装(数字,中文,字母,浮点数等)
qifeifei
javascript js
在项目开发的时候,经常有一些输入框,控制输入的格式,而不是等输入好了再去检查格式,格式错了就报错,体验不好。 /** 数字,中文,字母,浮点数(+/-/.) 类型输入限制,只要在input标签上加上 jInput="number,chinese,alphabet,floating" 备注:floating属性只能单独用*/
funct
- java 计时器应用
tangqi609567707
javatimer
mport java.util.TimerTask; import java.util.Calendar; public class MyTask extends TimerTask { private static final int
- erlang输出调用栈信息
wudixiaotie
erlang
在erlang otp的开发中,如果调用第三方的应用,会有有些错误会不打印栈信息,因为有可能第三方应用会catch然后输出自己的错误信息,所以对排查bug有很大的阻碍,这样就要求我们自己打印调用的栈信息。用这个函数:erlang:process_display (self (), backtrace).需要注意这个函数只会输出到标准错误输出。
也可以用这个函数:erlang:get_s
评论
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
刚刚自己再手写了一个my_atoi,同等规模下测试,时间为:13536 ms为什么差距就这么大涅?
long my_atoi(const char *str)
{
long val = 0;
bool b_neg = ('-' == *str);
if(*str == '-' || *str == '+')++str;
while(1)
switch(*str++)
{
case 0:
return b_neg?-val:val;
case '0':
val = val*10 + 0;
break;
case '1':
val = val*10 + 1;
break;
case '2':
val = val*10 + 2;
break;
case '3':
val = val*10 + 3;
break;
case '4':
val = val*10 + 4;
break;
case '5':
val = val*10 + 5;
break;
case '6':
val = val*10 + 6;
break;
case '7':
val = val*10 + 7;
break;
case '8':
val = val*10 + 8;
break;
case '9':
val = val*10 + 9;
break;
default:
return 0;
}
return 0;
};
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
改善了一下my_atoi, 同等规模下测试,时间为:3468 ms这一下心里平衡了,可以安稳睡一个觉了
long my_atoi(const char *str)
{
long val = 0;
bool b_neg = ('-' == *str);
if(*str == '-' || *str == '+')++str;
while(*str)
{
if(('0' - 1) < *str && *str < ('9' + 1))
val = val*10 + *str++ - '0';
else
break;
}
return b_neg?-val:val;
}
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
再次改善了一下,加了一个inline,时间变为 2562 ms了,因为去掉了函数调用开销inline long my_atoi(const char *str)
{
long val = 0;
bool b_neg = ('-' == *str);
if(*str == '-' || *str == '+')++str;
while(*str)
{
if(('0' - 1) < *str && *str < ('9' + 1))
val = val*10 + *str++ - '0';
else
break;
}
return b_neg?-val:val;
}
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
DFA使用二维数组存放之后,快是必然的结果。以前自己写过一个动态而不是生成代码的词法分析器,都能有1秒钟44万token的吞吐量。倘若是生成,不更快也说不过去。
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
@陈梓瀚(vczh)我知你对这类东西蛮有研究的,介绍Ragel,你不妨去弄弄,据我现在所得结果,虽然都是自动机识别,但他比Lex要快,尤其-G2选项之后,函数全部内联,统统goto,没有用数组,速度快到无法形容。
另外还可以生成dot文件,调用Graphviz画出自动机的图形,这个很爽啊(我把ragel生成的r_atoi自动机图补到上面了,翻上去找找...)
不知谁有闲时间去翻译一下它的man page,我想去翻译,无奈真是太忙了,生活所迫啊。
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
Ragel用来解析协议是很棒,很快的东西。Ruby的若干个http服务器,是使用Ragel生成http_parser的。还有解析html,xml的,等等。
做网络或者Web数据抓取的,也有空的兄弟,可以研究下,无奈中文资料基本没有,国外使用的人也不是太多。
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
这个我也写过80-110W(token)/s, 在HP3906上跑的,这个转到二维矩阵后速度基本都定在那里了,瓶颈都是在内存传输的速度上了。我当时自己写的regexp engine,跑C语言的文法。