Ragel State Machine Compiler 的速度测试
据说Ragel生成的自动机程序,速度飞快,特地测试了一下,所得结果如下。
测试环境: VC6 + Release下编译
测试规模: 一亿次
测试用例: Ragel编译r_atoi.rl文件 vs crt lib的 atoi函数
测试结果:
Ragel的编译选项 |
时间(毫秒) |
crt lib 的atoi |
5218 |
-T0 |
31500 |
-T1 |
26328 |
-F0 |
17797 |
-F1 |
13578 |
-G0 |
13203 |
-G1 |
10531 |
-G2 |
5422 |
-G2选项编译后生成的代码,速度确实强大,基本上和atoi库函数没有多少差别,要知道atoi可是crt lib里的啊,已经精到不能再精,优化到不能再优化了。
PS:很久前,我曾用汇编写了个my_memcpy,然后和crt lib的memcpy比速度,结果只有它的一半效率,然后用C写个再比,下滑到了1/6,从此以后我再也不怀疑crt lib的效率了,取而代之的是异常崇拜。
l Ragel的编译选项
l 测试程序如下
#include <windows.h>
int main()
{
char* p_sz = "784215491\n";
long val = 0;
long tick = GetTickCount();
for (int i = 0; i < 100000000; ++i)
{
val = atoi(p_sz);
//val = r_atoi(p_sz);//---- Ragel生成的状态机
}
tick = GetTickCount() - tick;
printf("%ld\n", tick);
return 0;
}
l r_atoi.rl如下
/*
* Convert a string to an integer.
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
%%{
machine r_atoi;
write data;
}%%
long r_atoi( char *str )
{
char *p = str, *pe = str + strlen( str );
int cs;
long 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';
# Initialize and execute.
write init;
write exec;
}%%
if ( neg )
val = -1 * val;
if ( neg )
val = -1 * val;
if ( cs < r_atoi_first_final )
fprintf( stderr, "r_atoi: there was an error\n" );
return val;
};
#define BUFSIZE 1024
/*
int main()
{
char buf[BUFSIZE];
while ( fgets( buf, sizeof(buf), stdin ) != 0 ) {
long value = r_atoi( buf );
printf( "%lld\n", value );
}
return 0;
}
*/
#include <windows.h>
#include <limits.h>
int main()
{
char* p_sz = "784215491\n";
long val = 0;
long tick = GetTickCount();
for (int i = 0; i < 100000000; ++i)
{
val = r_atoi(p_sz);
}
tick = GetTickCount() - tick;
printf("%ld\n", tick);
return 0;
}
自动 生成的自动机图形
posted on 2009-01-02 00:09 肥仔 阅读(3261) 评论(7) 编辑 收藏 引用 所属分类: 状态机 & 自动机 & 形式语言
评论
#re: Ragel State Machine Compiler 的速度测试 回复 更多评论
刚刚自己再手写了一个my_atoi,同等规模下测试,时间为:13536 ms
为什么差距就这么大涅?
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
改善了一下my_atoi, 同等规模下测试,时间为:3468 ms
这一下心里平衡了,可以安稳睡一个觉了
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
再次改善了一下,加了一个inline,时间变为 2562 ms了,因为去掉了函数调用开销
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
以前自己写过一个动态而不是生成代码的词法分析器,都能有1秒钟44万token的吞吐量。倘若是生成,不更快也说不过去。
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
另外还可以生成dot文件,调用Graphviz画出自动机的图形,这个很爽啊(我把ragel生成的r_atoi自动机图补到上面了,翻上去找找...)
不知谁有闲时间去翻译一下它的man page,我想去翻译,无奈真是太忙了,生活所迫啊。
# re: Ragel State Machine Compiler 的速度测试 回复 更多评论
# re: Ragel State Machine Compiler 的速度测试回复 更多评论
这个我也写过80-110W(token)/s, 在HP3906上跑的,这个转到二维矩阵后速度基本都定在那里了,瓶颈都是在内存传输的速度上了。
Ragel State Machine Compiler 的速度测试相关推荐
- 【翻译】What is State Machine Diagram(什么是状态机图)?
[翻译]What is State Machine Diagram(什么是状态机图)? 写在前面 在上一篇学习类图的时候将这个网站上的类图的一篇文章翻译了出来,感觉受益良多,今天来学习UML状态机图, ...
- Android系统自带的层次状态机StateMachine(Hierarchical State Machine)
Android系统自带的层次状态机StateMachine(Hierarchical State Machine) Android在framework层自己实现一套层次状态机,总共有三个类:State ...
- 《计算机组成与CPU设计实验》5有限状态机的Verilog HDL描述(Finite State Machine,FSM)
多数控制逻辑都可以用有限状态机描述 状态机 状态机是组合逻辑和时序逻辑的特殊组合 时序逻辑用于存储状态 组合逻辑用于产生次态和产生输出 状态的数量是有限的,故称为有限状态机(Finite State ...
- Squirrel State Machine
squirrel-foundation Maven 快速开始 基础概念 高级特性 Maven 当前最新发行版本 <dependency><groupId>org.squirre ...
- 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )
文章目录 一.测试 WebP 图片解码速度 二.测试 WebP 图片编码速度 三.参考资料 测试结果 : WebP 格式图片 , 解码快 , 编码慢 , 占用空间小 ; 在解码速度上 , WebP 格 ...
- java文件复制速度_java中文件复制得速度测试
//需要将apache开发的两个插件包拷到lib目录下:commons-fileupload-1.2.2.jar commons-io-2.0.1.jar package com.nay.servl ...
- Spring State Machine:它是什么,您需要它吗?
状态机是基于有限状态的计算模型 ,正如Wikipedia非常明确地说的那样. 通常,工作流会与状态一起使用,这意味着您不能仅从任何状态进入任何其他状态:应遵循一些规则. 这些状态之间的转换受规则限制. ...
- 【转】xilinx usb下载器 速度高速极限设置 JTAG-SMT2 JTAG-HS2 JTAG-HS3和Platform Cable USB DLC9 DLC10速度测试
xilinx usb下载器 下载速度极限设置以及高速JTAG-SMT2(HS1 HS2 HS3)和DLC9 DLC10 速度测试 对于一款xilinx的下载器,研发和烧录以及boss都最关心下载速度的 ...
- linux ip brd不一致_3 个方便的命令行网速度测试工具 | Linux 中国
用这三个开源工具检查你的互联网和局域网速度.-- Ben Nuttall 能够验证网络连接速度使您可以控制计算机.使您可以在命令行中检查互联网和网络速度的三个开源工具是 Speedtest.Fast ...
- StringBuilder 和 String拼接10万个字符串的速度测试差别太大了
/*** StringBuilder 和 String拼接10万个字符串的速度测试差别太大了* String耗时毫秒: 32693* StringBuilder耗时毫秒: 16*/ public cl ...
最新文章
- first day
- HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场
- opencv图像和二维数组相互转换
- Matlab安装有限元FEM工具箱
- 技术大牛收割机!Java之父James Gosling现在哪里???
- Hadoop2.7.6在Windows7单机部署
- 20220202--CTF刷题MISC方向--第8题--十六进制转化成ASCII
- python大数据开发平台_python示例
- tasm报错illegal memory reference的解决办法
- Vancouver wechat
- 难以置信:某国产平台制定打包deb规范,竟然没有测试
- 【UVA725】Division(暴力求解--水题)
- 实战 使用Java开发简易小游戏:贪吃蛇(附源码!)
- HDL Designer Series(HDS)介绍
- 艾米丽Java游戏_艾米丽玩闹鬼 Emily Wants To Play中文游戏介绍_游戏库_巴士单机游戏...
- 古墓丽影10linux,《古墓丽影11:暗影》Linux平台与Windows平台流畅度对比
- 如何使用 JAVA 开发微信登录教程
- 基本算法4.1堆积木详细题解
- 2009年国际电力行业十大新闻
- php无闪动刷新,简单的无闪动刷新页面/部分内容
热门文章
- 我们写APP和小程序或者H5用的前端UI--ColorUI
- 必须收藏的文档:IronPython脚本在TIBCO Spotfire中的使用
- 【实训】基于java进销存管理系统
- 求职类App原型制作分享-Part-time Clouds
- 国外统计学课程主页Statistical Books, Manuals and Journals
- 海量图标矢量图免费下载【来自阿里】
- Java 一个简单的接口使用案例
- 通信方式、通信接口、通信总线、通信协议的关系
- GB28181国标流媒体服务(LiveGBS)-支持海康8700等联网网关通过接入实现web端无插件直播...
- 大华海康宇视等监控安防摄像头如何通过GB/T28181平台接入到GB28181国标流媒体平台