如果mktime慢?那就使用自定义函数吧!

参考网址:https://gmbabar.wordpress.com/2010/12/01/mktime-slow-use-custom-function/

最近我正在做以ASCII(C字符串)格式表示的时间戳的工作。为了不同的计算,我经常需要转换时间戳字符串到epoch时间。标准C库提供mktime函数,它把已经填充的tm结构作为参数传递给mktime函数。如果你不非常频繁的使用该函数,它工作的很好。但是如果你需要在运行时转换数以万计的时间戳字符串,这个函数就变成应用程序的瓶颈。我没有尝试去阅读mktime的源代码和汇编代码,因此我不能确定为什么这个函数开销会这么大。但是我只是实现自己的自定义函数完成mktime做的转换。结果让我不敢相信。每个函数运行1M调用,结果如下:

mktime: 2950000 microseconds

time_to_epoch: 60000 microseconds

下面是自定义函数的源代码:

注:当时区为北京时间时,utcdiff设置为-8时才能得到UTC时间,即time(NULL)时间。

time_t time_to_epoch ( const struct tm*ltm, int utcdiff ) {

const int mon_days [] =

{31, 28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31};

long tyears, tdays, leaps,utc_hrs;

int i;

tyears = ltm->tm_year –70 ; // tm->tm_year is from 1900.

leaps = (tyears + 2) / 4;// no of next two lines until year 2100.

//i = (ltm->tm_year –100) / 100;

//leaps -= ( (i/4)*3 + i%4);

tdays = 0;

for (i=0; i <ltm->tm_mon; i++) tdays += mon_days[i];

tdays += ltm->tm_mday-1;// days of month passed.

tdays = tdays + (tyears *365) + leaps;

utc_hrs = ltm->tm_hour +utcdiff; // for your time zone.

return (tdays * 86400) +(utc_hrs * 3600) + (ltm->tm_min * 60) + ltm->tm_sec;

}

void str_to_tm ( char *mdate, char *mtime, structtm* mtm ) {

char*pstr;

long year,month, day, hour, min, sec;

year =strtol( mdate, &pstr, 10 );

month =strtol( ++pstr, &pstr, 10 );

day =strtol( ++pstr, &pstr, 10 );

hour =strtol( mtime, &pstr, 10 ); while( !isdigit(*pstr) ) ++pstr;

min =strtol( pstr, &pstr, 10 ); while( !isdigit(*pstr) ) ++pstr;

sec =strtol( pstr, &pstr, 10 );

mtm->tm_sec = sec;

mtm->tm_min = min;

mtm->tm_hour = hour;

mtm->tm_mday = day;

mtm->tm_mon = month – 1;

mtm->tm_year = year – 1900;

}

int main ( int argc, char *argv[] ) {

charmydate[] = “2010-11-30”;

charmytime[] = “11:30:45”;

struct tmmtm;

time_tticks, mytcks;

str_to_tm( mydate, mytime, &mtm );

mytcks =time_to_epoch ( &mtm, 5 );

ticks = mktime( &mtm );

printf ( ”std func time : %s”, asctime( localtime( &ticks ) ) );

printf ( ”our func time : %s”, asctime( localtime( &mytcks ) ) );

printf ( ”stdlib func ticks : %ld \n”, ticks );

printf ( ”our func ticks : %ld \n”, mytcks );

}

输出如下:

std func time : Tue Nov 30 11:30:45 2010

our func time : Tue Nov 30 11:30:45 2010

std func ticks : 1291134645

our func ticks : 1291134645

时间: 2024-10-12 16:45:38

如果mktime慢?那就使用自定义函数吧!的相关文章

Oracle自定义函数1

用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样,如max(value)函数,其中,value被称为参数.函数参数有3种类型. IN 参数类型:表示输入给函数的参数. OUT 参数类型:表示参数在函数中被赋值,可以传给函数调用程序. IN OUT参数类型:表示参数既可以传值也可以被赋值. 1.语法格式: SQL语法方式创建的语法格式为: CREATE OR REPLACE FUNCTION function_name         /*函数名称*/(Para

一个可以使用多个正则表达式进行多次尝试匹配,并进行替换的Excel VBA自定义函数(UFD)

以下代码可使用多个正则表达式对目标单元格进行多次匹配尝试,如匹配成功,将停止尝试匹配其他正则表达式,并且使用该正则表达式相对应的替换表达式进行替换,返回替换结果. 使用前需要做Early Binding.即在VBE编辑器中,选择菜单栏中的Tool - Reference,如图: 弹出如下图的对话框后,选择Microsoft VBSscript Regular Expression 5.5,打钩,点OK. 此UDF的使用方法为: Text参数:需要进行处理的原始文字或单元格. MatchPatte

MySQL学习笔记-自定义函数

MySQL学习笔记-自定义函数 1.自定义函数简介 自定义函数:用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同 自定义函数的两个必要条件:(1)参数  (2)返回值 自定义函数: 创建自定义函数 CREATE FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body 关于函数体: 1.函数体可以由合法的SQL语句构成: 2.函数体可以是

FastReport调用Delphi中的自定义函数

//定义一个函数: function SmallToMoney(akey: real): string; begin   //'1234500' end; //此处为fastreport加载自定义函数以便引用 procedure Tprint_from.FormCreate(Sender: TObject);begin  frxReport1.AddFunction('function SmallToMoney(akey: real): string;', 'Myfunction', '函数功能

SQL 自定义函数(Function)——参数默认值

sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值. 内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图.它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体. 多声明表值函数:它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值

Oracle自定义函数

核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] datatype1, argu2 [mode2] datatype2, ........ ) return datatype is begin end; 执行 var v1 varchar2(100) exec :v1:=function_na 函数用于返回特定数据.执行时得找一个变量接收函数的返回值;

转:存储过程和自定义函数的区别

首先来看一下存储过程和自定义函数的概念 一. 什么是存储过程? 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理. 存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能. 存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数. 返回单个或多个结果集以及返回值. 可以出于任何使用SQL 语句的目的来使用存储过程

存储过程和自定义函数的区别

1: 1)存储过程,功能强大,可以执行包括修改表等一系列数据库操作,也可以创建为 SQL Server 启动时自动运行的存储过程. 自定义函数,用户定义函数不能用于执行一组修改全局数据库状态的操作. 2)存储过程,可以使用非确定函数. 自定义函数,不允许在用户定义函数主体中内置非确定函数. 3)存储过程,主要是返回一个int状态结果,也可返回记录集. 自定义函数,可以返回表变量. 关于这个,很容易糊涂.存储过程,可以使用这样的形式来返回N多的结果: create procedure sp1  a

SQL中存储过程和自定义函数的区别(转载)

存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能.存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数.返回单个或多个结果集以及返回值. 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 1.可以在单个存储过程中执