原本是用perl写了一个通过给定的时间范围来筛选一个比较大的日志文件。但是测试发现筛选130W行日志需要2分多钟,对其中几个低效率函数单独进行了效率测试,发现构造100W个时间对象所花时间也是个大户。

于是,特地比较了几种语言构造100W个时间对象(或时间结构)的性能。以下是结论:

  • Perl(Time::Piece模块):13秒
  • Python(time模块):8.8秒(arrow包:50秒)
  • Ruby(内置Time类):2.8秒
  • Ruby(第三方类DateTime):0.9-1秒
  • Golang(Time包):编译好的0.17秒,编译+执行0.26秒
  • C(time.h):0.042秒

下面是各语言测试代码:

# Perl(Time::Piece)
$ time perl -MTime::Piece -e 'for(1..1000000){$t = Time::Piece->strptime("2017-03-23 16:30:15", "%Y-%m-%d %H:%M:%S")}'
real    0m13.045s
user    0m11.969s
sys     0m0.011s
# Ruby(Time)
$ time ruby -e '1000000.times {|x| t=Time.new(2017,3,23,16,30,15)}'
real    0m2.755s
user    0m1.781s
sys     0m0.767s
# Ruby(Datetime)
$ time ruby -r'date' -e '1000000.times {|x| t = DateTime.strptime("2017-03-23 16:30:15", "%Y-%m-%d %H:%M:%S")}'
real    0m0.994s
user    0m0.885s
sys     0m0.036s
# Python
import time

fmt = "%Y-%m-%d %H:%M:%S"
for i in range(0,1000000):
        time.strptime("2017-10-23 12:30:23", fmt)

$ time python3 a.py
real    0m8.411s
user    0m7.805s
sys     0m0.094s
# Golang
package main

import (
        "time"
)

func main() {
        const format = "2006-01-02 15:04:05"
        for i := 1; i < 1000000;i++ {
                time.Parse(format, "2018-03-23 16:30:15")
        }
}

$ time go run a.go       # 编译加执行的go程序

real    0m0.267s
user    0m0.213s
sys     0m0.070s

$ time ./a         # 编译过后的go程序

real    0m0.176s
user    0m0.162s
sys     0m0.001s
// C
#define _XOPEN_SOURCE
#include <time.h>

int main(void) {
        struct tm tm;
        int i;
        for(i = 1;i<=1000000;++i){
                strptime("2017-03-23 16:30:15", "%Y-%m-%d %H:%M:%S", &tm);
        }
        return 0;
}

$ time ./time.out 

real    0m0.042s
user    0m0.039s
sys     0m0.001s

那么,对于写脚本的话,采用哪门语言呢?我想Ruby是很不错的选择,Golang也是不错的选择。

效率对比:各种语言构造100W个时间对象的更多相关文章

  1. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  2. Bulk Insert & BCP执行效率对比

    我们以BCP导出的CSV数据文件,分别使用Bulk insert与BCP导入数据库,对比两种方法执行效率 备注:导入目标表创建了分区聚集索引 1.BCP导出csv数据文件 数据量:15000000行, ...

  3. 如何用C#语言构造蜘蛛程序

    "蜘蛛"(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载We ...

  4. FileInputStream 与 BufferedInputStream 效率对比

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3550158.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  5. golang 浮点数 取精度的效率对比

    需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" " ...

  6. Snapman系统中TCC执行效率和C#执行效率对比

    Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面4方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 4.MD5算法 这是C ...

  7. read()/fread()/mmap()执行效率对比

    一. read()/fread()/mmap()执行效率对比 系统调用read.c: #include <sys/types.h> #include <sys/stat.h> ...

  8. 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)

    1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...

  9. 使用file_get_contents()和curl()抓取网络资源的效率对比

    使用file_get_contents()和curl()抓取网络资源的效率对比 在将小程序用户头像合成海报的时候,用到了抓取用户头像对应的网络资源,那么抓取方式有很多,比如 file_get_cont ...

随机推荐

  1. 深入浅出理解linux inode结构

    一.inode是什么? 参考文档:http://tech.diannaodian.com/dw/lin/2012/0112/154629.html 做Android底层驱动或者嵌入式Linux的程序猿 ...

  2. How to add more to Git Bash on Windows

    How to add more to Git Bash on Windows Download the lastest wget binary for windows from https://ete ...

  3. unity手游使用terrian注意事项

    1.Terrain比较占性能,普通机器测试,未开terrain  60帧,开启terrain后  30帧 2.Terrain的size大小与占用性能无关,不过越小的Terrain的烘焙上去的阴影越模糊 ...

  4. Linux的应用层到底层驱动的调用过程

    应用层如何内核.md 1.从应用层打通内核:驱动 首先来说是设备号的引入,我们通过 cat/proc/kallsyms |grep mydevice 可以查看设备号,当然我们也是可以自己创建设备号,这 ...

  5. MVC中提交表单的4种方式

    一,MVC  HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){} BeginRouteForm ...

  6. Design Pattern理解碎片

    开发封闭原则(Open-Closed Principle OCP)Software entities(classes,modules,functions etc) should open for ex ...

  7. TCP/IP、Http、Soap三个基本的通讯协议

    看到一个说法,比较通俗易懂: HTTP就是邮局的协议,他们规定了你的信封要怎么写,要贴多少邮票等....         SOAP就是你们之间交流的协议,负责把你所需要表达的意思写在信纸上,同时也负责 ...

  8. 微软的深度学习框架cntk ,我目前见过 安装方式最简单的一个框架,2.0之后开始支持C# 咯

    wiki:https://github.com/Microsoft/CNTK/wiki 嗨,你也是我这种手残党么?之前试着安装着mxnet和tensorflow,但是因为时间比较短所以往往来不及安装完 ...

  9. Java web service 异常

    1.org/apache/commons/discovery/tools/DiscoverSingleton Exception in thread "main" java.lan ...

  10. OLEDB 静态绑定和数据转化接口

    OLEDB 提供了静态绑定和动态绑定两种方式,相比动态绑定来说,静态绑定在使用上更加简单,而在灵活性上不如动态绑定,动态绑定在前面已经介绍过了,本文主要介绍OLEDB中的静态,以及常用的数据类型转化接 ...