效率对比:各种语言构造100W个时间对象

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

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

  • Perl(Time::Piece模块):13秒
  • Python(time模块):8.8秒
  • 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也是不错的选择。

原文地址:https://www.cnblogs.com/f-ck-need-u/p/10798066.html

时间: 2024-11-04 05:39:43

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

类的构造及初始化效率对比

基础数据结构: struct A { int a; int b; int c; int d; int e; int f; int g; }; 初始化次数:const int MAX_LOOP_NUM = 100000000; 第一种方式: 无初始化 struct A { A() { } int a; int b; int c; int d; int e; int f; int g; }; for(int index = 0; index < MAX_LOOP_NUM; ++index) { A

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

ArrayList与LinkedList效率对比

ArrayList与LinkedList效率对比 概述 ArrayList 是一个动态数组,它是线程不安全的,允许元素为null.其底层数据结构依然是数组,因为实现了RandomAccess接口,所以拥有随机快速访问的能力,ArrayList可以以O(1)的时间复杂度去根据下标访问元素.由于数组的内存连续,可以根据下标以O1的时间改查元素,因此时间效率很高. LinkedList 是一个双向链表,它是 线程不安全的,允许元素为null.其底层数据结构是链表,和ArrayList比,没有实现Ran

Oracle常用导出导出命令及性能效率对比

说明 Oracle导入导出命令主要有EXPDP和IMPDP.EXP和IMP,区别如下:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用.IMP只适用于EXP导出的文件,不适用于EXPDP导出文件:IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件.expdp或impdp命令时,可暂不指出用户名/密码@实例名as 身份,然后根据提示再输入,如:expdp schem

CMap与hash_map效率对比

CMap与hash_map底层均采用hash stable实现,CMap是MFC提供的模板类.hash_map虽然目前并未纳入C++标准模板类库,但几乎每个版本的STL都提供了相应的实现.CMap与hash_map的存储于查询效率比较如下: 利用rand函数随机生成99999个整数构成查询数据集,紧接着申请9999个整数作为查询.测试两个模板类的插入与查询总时间,测试结果显示:当查询都不存在时CMap时间大约16ms,hash_map为0ms:当大部分查询存在时CMap时间为624,而hash_

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

Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面3方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 这是C#代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Tex

java StringBuffer,StringBuilder,String自身连接效率对比

当我们仅仅需要a+b 的时候,两个字符串链接任何方法的效率基本一样,都在0.0001毫秒内就可以完成.不过如果需要1万次,10000万次,就会发现string自身的join速度显著下降 package com.java.lang; public class StringTest { int MAX = 10000; //1万次累加 public String Buffer(){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < MA

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

需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" "fmt" ) func main() { threadCount := 100000 fa := 3.233667 time1 := TestFn(threadCount,fa,func(fa float64) string{ return strconv.FormatFloat(fa,'f',2

Android Ant 和 Gradle 打包流程和效率对比

一.Ant 打包:(下载ant.配置环境变量就不说了) 1.进入命令行模式,并切换到项目目录,执行如下命令为ADT创建的项目添加ant build支持: android update project -p . -t  "android-17" 2.build脚本默认target是help,所以会显示如上信息,修改target为debug或release就可以像无ant时一样编译.生成以及调试了. 3.使用release时  在local.properties添加签名信息 #keysto