原本是用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也是不错的选择。

最新文章

  1. 使用EF自带的EntityState枚举和自定义枚举实现单个和多个实体的增删改查
  2. 关于访问链接返回XML的获取数据
  3. objective-c(反射)
  4. [转]Cookie/Session机制详解
  5. Java 集合 - LinkedList
  6. 解决C# 转到定义时打开的是元数据文件而非源代码文件的问题
  7. [Microsoft Test Manager]CodeUI初探
  8. ios 编码转换 保存文件
  9. VS2010 ReportViewer导出文件下载保存不能识别文件类型
  10. php 引用一点要小心使用
  11. 搜索历史命令 Ctrl + R ( ctrl + r to search the history command )
  12. nginx rewrite 指令
  13. 基于 node 搭建博客系统(一)
  14. Sudoku 个人项目1
  15. EZ 2018 05 20 NOIP2018 模拟赛(十五)
  16. Django ORM中使用update_or_create功能再解
  17. Mac下配置/使用GitHub
  18. org.springframework.dao.InvalidDataAccessApiUsageException报错
  19. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)
  20. sqoop连接SqlServer2012示例

热门文章

  1. Python中将列表转化成矩阵表示
  2. RESTful 设计工具和Web框架
  3. Docker的基本构架
  4. 深入理解JavaScript系列(33):设计模式之策略模式
  5. flex布局的一些注意点
  6. mysql四-2:多表查询
  7. 从list中随机选出几个数,并按照原来的顺序排列
  8. querySelector()与querySelectorAll()的区别及NodeList和HTMLCollection对象的区别
  9. git如何进行远程分支切换
  10. Spring应用开发常见规范