效率對比:各類語言構造100W個時間對象

本來是用perl寫了一個經過給定的時間範圍來篩選一個比較大的日誌文件。可是測試發現篩選130W行日誌須要2分多鐘,對其中幾個低效率函數單獨進行了效率測試,發現構造100W個時間對象所花時間也是個大戶。python

因而,特意比較了幾種語言構造100W個時間對象(或時間結構)的性能。如下是結論:ruby

  • Perl(Time::Piece模塊):13秒
  • Python(time模塊):8.8秒(arrow包:50秒)
  • Ruby(內置Time類):2.8秒,直接指定時區則只需0.6秒
  • Ruby(標準庫DateTime):strptime格式化需0.9-1秒,直接DateTime.new則只需0.4秒
  • Golang(Time包):編譯好的0.17秒,編譯+執行0.26秒
  • C(time.h):0.042秒

下面是各語言測試代碼:bash

# 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

$ time ruby -e '1000000.times {|x| t=Time.new(2017,3,23,16,30,15,"+08:00")}'

real    0m0.685s
user    0m0.500s
sys     0m0.203s
# 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

$ time ruby -r'date' -e '1000000.times {|x| t = DateTime.new(2017,3,23,16,30,15)}'
real    0m0.450s
user    0m0.234s
sys     0m0.219s
# 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也是不錯的選擇。函數

後來我又對比了一下perl/python/ruby在單純的循環上的效率,算是解釋型語言在純計算上的優劣,結果python差的很遠,而ruby又再次領先。性能

# perl循環一億次
$ time perl -e '$a=0;$i=0;for(1..100000000){$a+=1;}'
real    0m2.688s
user    0m2.672s
sys     0m0.016s

# python循環一億次
[root]$ time python <<eof
a=0
i=0
for i in range(100000000):
  a+=1

eof

real    0m6.682s
user    0m4.594s
sys     0m2.094s

# ruby以range的方式循環一億次
[root]$ time ruby -e 'a=0;for i in (1..100000000) do a+=1;end'
real    0m3.778s
user    0m3.531s
sys     0m0.266s

# ruby以while條件判斷的方式循環一億次
[root]$ time ruby -e 'a=0;i=0;while(i<100000000) do a+=1;i+=1 end'
real    0m1.728s
user    0m1.516s
sys     0m0.234s
相關文章
相關標籤/搜索