Ragel State Machine Compiler 的速度测试

article/2025/4/20 3:06:22

据说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的编译选项

clip_image002

 

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;

}

 

自动 生成的自动机图形

 testRagel

posted on 2009-01-02 00:09 肥仔 阅读(3261) 评论(7)  编辑 收藏 引用 所属分类: 状态机 & 自动机 & 形式语言

评论

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; 
};
2009-01-02 01:00 |  肥仔

http://chatgpt.dhexx.cn/article/vOxo9aMu.shtml

相关文章

Hello Ragel -- 生成状态机的神器

Ragel 是个很 NB 的能生成状态机的编译器&#xff0c;而且支持一堆语言&#xff1a;C、C、Object-C、C#、D、Java、Go 以及 Ruby。 原来的文本解析器是用正则表达式实现的&#xff0c;随着状态&#xff08;if-else&#xff09;越来越多&#xff0c;修改越来越麻烦。。。 安装 M…

嵌入式系统开发流程

一、嵌入式系统开发流程 1、系统需求分析&#xff1a;根据需求&#xff0c;确定设计任务和设计目标&#xff0c;指定设计说明书。 2、体系结构设计&#xff1a;描述系统如何实现所述的功能需求&#xff0c;包括对硬件、软件和执行装置的功能划分以及系统的软件、硬件选型。 …

嵌入式系统开发设计

嵌入式系统开发设计 嵌入式系统设计的主要任务是定义系统的功能、决定系统的架构&#xff0c;并将功能映射到系统实现架构上。系统架构既包括软件系统架构也包括硬件系统架构。 嵌入式系统设计具有以下特点&#xff1a; 软、硬件协同并行开发&#xff1b; 微处理器的类型多种…

嵌入式系统的概念,嵌入式系统的组成及特点,嵌入式系统的基本开发流程

1. 嵌入式系统的概念 嵌入式系统( Embedded system) , 是一种 "完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。 2 . 嵌入式系统的组…

配置嵌入式系统开发环境(教程)

配置嵌入式系统开发环境 前言一. 安装VMware Workstation&#xff1f;二、在虚拟机中安装Windows XP镜像1.创建虚拟机启动虚拟机进入PE系统 关于pdf中预实验的补充说明 前言 嵌入式实时操作系统及应用开发&#xff08;第三版&#xff09;罗蕾主编光盘镜像 链接&#xff1a;htt…

嵌入式Linux系统开发笔记(七)

嵌入式Linux系统开发笔记&#xff08;七&#xff09; 七、U-Boot基础 1.概述 在移植 Linux之前我们需要先移植一个 bootloader 代码&#xff0c;这个 bootloader 代码用于启动 Linux 内核&#xff0c; bootloader有很多&#xff0c;常用的就是 U-Boot。 移植好 U-Boot 以后再…

迅为-iMX6ULL开发板原创嵌入式开发文档系统化学习

iTOP-IMX6ULL核心板采用单核Cortex-A7架构&#xff0c;主频高达528 MHz&#xff0c;CPU集成电源管理&#xff0c;146 PIN引脚全部引出。核心板接口引出串口8路、CAN 2路、网口2路、I2C1路、SPI 2路、PWM8路、ADC5路、USB1路等功能。核心板在IMX6UL开发板上进行了深度优化&#…

Vxworks嵌入式开发系统入门基础概念学习

1.VxWorks应用 自动化设备、工业控制&#xff08;实时性好&#xff09;、军用设备以及消费电子。 2.实时性 实时性包括硬实时、软实时。硬实时系统有一个刚性的、不可改变的deadlines&#xff0c;它不允许任何超出deadlines的错误。而软实时是一个柔性灵活的&#xff0c;它可以…

嵌入式系统的开发流程

嵌入式系统的开发流程 摘要&#xff1a;本文以 HHARM9-EDU为例&#xff0c;简要说明一下嵌入式系统的开发流程。 整个流程很简单&#xff0c;流程图如下&#xff1a; 一、配置Linux及MINIGUI ①配置Linux&#xff1a; 由于 HHARM9-EDU推荐使用Redhat 9&#xff0c;所以这里只介…

嵌入式开发系统的简介

小白日志&#xff08;一&#xff09; 嵌入式开发系统的简介 嵌入式系统是一种以硬件为载体&#xff0c;以计算机技术为基础&#xff0c;以应用程序为核心&#xff0c;满足特定功能、要求以及应用环境的专用计算机系统。所谓“嵌入式”&#xff0c;顾名思义&#xff0c;嵌入到…

嵌入式系统开发环境概述

嵌入式系统开发环境主要包括&#xff1a; 集成开发工具交叉编译器批处理文件makefileLink Script调试工具下载工具其它工具(Offline Tools)模拟器版本控制工具 接下来分别讲解以上各个工具&#xff1a; 1、集成开发工具 一般CPU厂商会提供针对该CPU的集成开发环境(IDE)&…

嵌入式系统概述3-嵌入式系统的开发流程和学习基础、方法

嵌入式系统的开发流程 以带有操作系统的32位微处理器为核心的嵌入式系统为例&#xff1a; 第一步&#xff1a;建立开发环境 操作系统一般使用Redhat Linux&#xff0c;选择定制安装或全部安装&#xff0c;通过网络下载相应的GCC交叉编译器进行安装(比如&#xff0c;arm-linu…

嵌入式系统开发概述

1、嵌入式系统是什么 2、嵌入式系统的组成 3、嵌入式开发与传统单片机开发不同 4、嵌入式应用和就业方向 5、学习路线 1、嵌入式系统是什么&#xff1f; 嵌入式系统&#xff08;百度&#xff09;&#xff1a;嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#…

mysql给用户授予某数据库权限_mysql 数据库授权(给某个用户授权某个数据库)

mysql 数据库授权(给某个用户授权某个数据库) 2016-10-10 带你飞 1.新建用户。 //登录MYSQL >mysql -u root -p >密码 //创建用户 mysql> insert into mysql.user(Host,User,Password) values("localhost","phplamp",password("1234"))…

MySQL数据库用户管理以及数据库用户授权

目录 一、数据库用户管理 1、新建用户 2、查看用户信息 3、重命名用户 4、删除用户 5、修改当前登录用户密码 6、修改其他用户密码 7、忘记 root 密码的解决办法 7.1 修改 /etc/my.cnf 配置文件&#xff0c;不使用密码直接登录到 mysql 7.2 使用 update 修改 root 密…

Mysql8数据库如何给用户授权

查看用户已有权限 SHOW GRANTS FOR [用户名];使用root用户授予所有权限 -- 授权 GRANT ALL PRIVILEGES ON [数据库名].[表明] TO [用户名][连接地址] WITH GRANT OPTION; -- 刷新权限 FLUSH PRIVILEGES;例如给numb用户的所有连接地址授权numb数据库所有表权限如下&#xff1a…

mysql授权用户多个数据库_MySQL创建用户授权数据库

MySQL等主流数据库的最高权限一般是root用户. 有时我们需要提供数据库的账号和密码以使用某些服务. 但实际上每个服务只会使用1个左右的数据库. 直接将root账号和密码随意分配是一件很危险的事情. 所以我们需要单独的创建用户, 并授权需要的数据库给它. 用户管理 创建用户 创建…

Mysql数据库给用户添加权限

1、Mysql下创建新的用户 新创建的用户默认是没有任何权限的。 语法格式&#xff1a; create user 用户名 identified by 密码; 2、给用户分配权限 语法结构&#xff1a; grant 权限 on 数据库.数据表 to 用户 主机名; 3、精确的控制用户的权限 略 参考博文&#xff1a; m…

mysql怎么给用户加权限_mysql怎么给用户加权限

mysql给用户加权限的方法&#xff1a;首先创建用户&#xff0c;代码为【create user 用户名 identified by 密码】&#xff1b;然后给用户分配权限&#xff0c;代码为【grant 权限 on 数据库.数据表 to 用户 主机名】。 mysql给用户加权限的方法&#xff1a; 一、Mysql下创建新…

matlab实现参数方程求导(paradiff函数)

目录 总述函数说明应用举例函数实现 总述 函数说明 function resultparadiff(y, x, t, n) %paradiff %参数方程求导的递归实现 % 调用格式&#xff1a; % y1 paradiff(y, x, t, n) % 其中&#xff1a;yf(t), xg(t), t为参数, n为导数阶次 % % Examples: % 已知参数方程…