设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 6057|回复: 12

[others] 各种常见语言执行效率 [复制链接]

Rank: 8Rank: 8

签到
828
注册时间
2010-2-26
最后登录
2017-5-2
在线时间
600 小时
阅读权限
90
积分
82550
帖子
789
主题
41
精华
0
UID
8062
发表于 2013-10-20 22:15:41 |显示全部楼层
今天群里在说这个事,于是就下手写写,看看结果(有些脚本是@莫言写的,py是@托马斯写的)
机器环境:
内存:4G
系统:OS X 10.9
CPU: 酷睿双核、i5  2.5GHZ
经过测试执行效率大体是: C > Java > LuaJIT > Golang > PyPy > Node.js > Perl > Lua > Ruby > AWK > Python > Tcl > Bash
附上各脚本代码:

sky@sky-MacBookPro tmp$ cat 1.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const char chs[] = {'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t','u','v','w','x',
'y','z','A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'!','@','#','$','%','^','&','*','_','-','+','=',':',';',
',','.','?','/','~','`'};

#define LINE_COUNT 200 * 10000
#define STRING_LEN 70

int main() {
    int length = 0;
    char str[STRING_LEN + 1] = {};
    int i = 0, j = 0;


    length = sizeof(chs) / sizeof(const char);

    for (i = 0; i < LINE_COUNT; i++) {
        for (j = 0; j < STRING_LEN; j++) {
            str[j] = chs[rand() % length];
        }

        printf("%s\n", str);
    }

    return 0;
}
======分割线======
sky@sky-MacBookPro tmp$ cat 1.go
package main

import (
"fmt"
"math/rand"
)

const (
LINE_COUNT = 200 * 10000
STRING_LEN = 70
)

func main() {
chs := [...]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^', '&', '*', '_', '-', '+', '=', ':', ';', ',', '.', '?', '/', '~', '`'}
str := make([]byte, STRING_LEN+1)
length := len(chs)
for i := 0; i < LINE_COUNT; i += 1 {
for j := 0; j < STRING_LEN; j += 1 {
str[j] = chs[rand.Int()%length]
}
fmt.Printf("%s", str)
}
}
====分割线====
sky@sky-MacBookPro tmp$ cat 1.lua
t = os.time()
math.randomseed(t)
chs = {'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t','u','v','w','x',
'y','z','A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'!','@','#','$','%','^','&','*','_','-','+','=',':',';',
',','.','?','/','~','`'};

LINE_COUNT=200 * 10000
STRING_LEN=70
length = #chs
str = {}

for i=0,LINE_COUNT do
    for j=1,STRING_LEN do
       str[j] = chs[math.random(1,length) % length+1]
    end
    print(table.concat(str))
end
===分割线===
sky@sky-MacBookPro tmp$ cat 1.pl
use strict;
use warnings;
use integer;

my $chs = join('', ('a','b','c','d','e','f','g','h','i','j',
    'k','l','m','n','o','p','q','r','s','t','u','v','w','x',
    'y','z','A','B','C','D','E','F','G','H','I','J','K','L',
    'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
    '!','@','#','$','%','^','&','*','_','-','+','=',':',';',
    ',','.','?','/','~','`'));

my $LINE_COUNT = 200 * 10000;
my $STRING_LEN = 70;
my $LEN = length($chs);



for (my $i=0; $i<$LINE_COUNT ; $i++) {
    my $lineString = '';

    for (my $j=0; $j<$STRING_LEN ; $j++) {
        $lineString .= substr($chs, rand($LEN), 1);
    }

    print $lineString,"\n";
}
===分割线===
sky@sky-MacBookPro tmp$ cat 1.php
<?php
define('LINE_COUNT', 200 * 10000);
define('STRING_LEN' ,70);
$chs = array('a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t','u','v','w','x',
'y','z','A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'!','@','#','$','%','^','&','*','_','-','+','=',':',';',
',','.','?','/','~','`');
$length = count($chs);
$str = array();
for($i=0;$i<LINE_COUNT;$i++) {
   for($j=0;$j<STRING_LEN;$j++) {
       $str[$j] = $chs[rand(0,$length) % $length];
   }
   echo implode('',$str);
}
===分割线===
sky@sky-MacBookPro tmp$ cat 1.rb
chs=['a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t','u','v','w','x',
'y','z','A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'!','@','#','$','%','^','&','*','_','-','+','=',':',';',
',','.','?','/','~','`']
LINE_COUNT = 200 * 10000
STRING_LEN = 70

str = Array.new
length = chs.length

LINE_COUNT.times do |i|
  STRING_LEN.times do |j|
     str[j] = chs[Random.rand(length) % length]
  end
  print str.join('')
end
===分割线===
sky@sky-MacBookPro tmp$ cat 2.py
import random
try:
    import cStringIO as StringIO
except:
    import StringIO
   

chs = ['a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t','u','v','w','x',
'y','z','A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'!','@','#','$','%','^','&','*','_','-','+','=',':',';',
',','.','?','/','~','`']

LINE_COUNT=200 * 10000
STRING_LEN=70
length = len(chs)
str_io = StringIO.StringIO()



for _ in xrange(LINE_COUNT):
    for _ in xrange(STRING_LEN):
        str_io.write(chs[random.randint(0, length-1)])
    print(str_io.getvalue())
    str_io.seek(0)

str_io.close()
===分割线===
sky@sky-MacBookPro tmp$ cat 1.awk
BEGIN{
   chs="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*_-+=:;.?/~`";
   LINE_COUNT=200 * 10000 ;
   STRING_LEN=70;
   len = length(chs);
}

{
   for(i=0;i<LINE_COUNT;i++) {
      for(j=0;j<STRING_LEN;j++) {
         r = int(rand * len) % len;
         str = str""substr(chs,r,r)
      }
      print str;
      str="";
   }
   exit;
}
===分割线===
sky@sky-MacBookPro tmp$ cat 1.tcl
#!/usr/bin/env tclsh

set chs {a b c d e f g h i j  k l m n o p q r s t u v w x  y z A B C D E F G H I J K L  M N O P Q R S T U V W X Y Z  ! @ # $ % ^ & * _ - + = : ; . ? / ~ ` ,}
set LINE_COUNT [expr 200 * 10000]
set STRING_LEN 70
set LEN [llength $chs]

for {set i 0} {$i < $LINE_COUNT} {incr i} {
    set str ""

    for {set j 0} {$j <= $STRING_LEN} {incr j} {
        append str [lindex $chs [expr int(rand() * $LEN)]]
    }

    puts $str
}

===分割线===
sky@sky-MacBookPro tmp$ cat 1.sh
#!/bin/bash

chs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*_-+=:;.?/~`'
LINE_COUNT=$((200 * 10000))
STRING_LEN=70
LEN=$((${#chs} + 1))

for ((i = 0; i < LINE_COUNT; i++)); do
    str=''
    for ((j = 0; j < STRING_LEN; j++)); do
        str="$str${chs((RANDOM % LEN)):1}"
    done

    echo "$str"
done

====over====
没想到python是那么的慢,但是加上pypy后居然性能提高了N倍从6分多直接到了20s+, luajit也确实牛奔,lua是45s+, luajit是6s,l另外不得不承认,C确实niubility,本次测试没别的意思,不歧视语言,仅是为了测试而测试!!!
<-sina_sign,1300626711,936f3b91,1->

Rank: 8Rank: 8

注册时间
2010-2-26
最后登录
2017-5-2
在线时间
600 小时
阅读权限
90
积分
82550
帖子
789
主题
41
精华
0
UID
8062
发表于 2013-10-20 23:30:54 |显示全部楼层
本帖最后由 bikong0411 于 2013-10-20 23:31 编辑

发现python慢主要慢在random.randint上,如果使用from random import randint,这样能提升不少性能,减少一次间接寻址,可以通过python  -m trace --trackcall 进行追踪,这样的话,python就快于ruby慢于php了
<-sina_sign,1300626711,936f3b91,1->

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-9-16
最后登录
2020-4-1
在线时间
960 小时
阅读权限
90
积分
269729
帖子
2158
主题
2
精华
0
UID
15647
发表于 2013-10-21 09:11:48 |显示全部楼层
感谢楼主分享呀

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-2-26
最后登录
2017-5-2
在线时间
600 小时
阅读权限
90
积分
82550
帖子
789
主题
41
精华
0
UID
8062
发表于 2013-10-21 12:57:27 |显示全部楼层
Rockyw 发表于 2013-10-21 09:11
感谢楼主分享呀

能换句话吗
<-sina_sign,1300626711,936f3b91,1->

使用道具 举报

Rank: 8Rank: 8

注册时间
2009-3-28
最后登录
2017-5-11
在线时间
80 小时
阅读权限
90
积分
18387
帖子
120
主题
15
精华
0
UID
2181
发表于 2013-10-21 14:54:05 |显示全部楼层
C还是No 1

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-9-16
最后登录
2020-4-1
在线时间
960 小时
阅读权限
90
积分
269729
帖子
2158
主题
2
精华
0
UID
15647
发表于 2013-10-22 09:04:31 |显示全部楼层
bikong0411 发表于 2013-10-21 12:57
能换句话吗

谢谢一楼分享!

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-2-26
最后登录
2017-5-2
在线时间
600 小时
阅读权限
90
积分
82550
帖子
789
主题
41
精华
0
UID
8062
发表于 2013-10-22 09:24:34 |显示全部楼层
Rockyw 发表于 2013-10-22 09:04
谢谢一楼分享!

经过总结,你常年就这几句话
<-sina_sign,1300626711,936f3b91,1->

使用道具 举报

Rank: 8Rank: 8

注册时间
2013-3-19
最后登录
2016-11-29
在线时间
111 小时
阅读权限
90
积分
30315
帖子
46
主题
1
精华
0
UID
37527
发表于 2013-10-22 09:30:38 |显示全部楼层

感谢楼主分享呀

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-9-16
最后登录
2020-4-1
在线时间
960 小时
阅读权限
90
积分
269729
帖子
2158
主题
2
精华
0
UID
15647
发表于 2013-10-22 10:38:28 |显示全部楼层
bikong0411 发表于 2013-10-22 09:24
经过总结,你常年就这几句话

没办法,人家分享东西给你,你不回复人家太没礼貌了

使用道具 举报

论坛元老

挨踢路上求取真经

Rank: 8Rank: 8

注册时间
2011-2-20
最后登录
2018-3-22
在线时间
743 小时
阅读权限
90
积分
156528
帖子
148
主题
5
精华
0
UID
12079
发表于 2013-10-24 21:37:19 |显示全部楼层
bikong0411 发表于 2013-10-22 09:24
经过总结,你常年就这几句话

观察细致入微

使用道具 举报

论坛元老

系统工程师

Rank: 8Rank: 8

注册时间
2013-5-9
最后登录
2018-1-22
在线时间
305 小时
阅读权限
90
积分
49853
帖子
74
主题
7
精华
0
UID
38183
发表于 2013-11-26 13:59:56 |显示全部楼层
shell会了,还想学多一门语言,学什么好?

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-2-26
最后登录
2017-5-2
在线时间
600 小时
阅读权限
90
积分
82550
帖子
789
主题
41
精华
0
UID
8062
发表于 2013-11-26 15:07:22 |显示全部楼层
jerry.han 发表于 2013-11-26 13:59
shell会了,还想学多一门语言,学什么好?

学学python吧
<-sina_sign,1300626711,936f3b91,1->

使用道具 举报

论坛元老

系统工程师

Rank: 8Rank: 8

注册时间
2013-5-9
最后登录
2018-1-22
在线时间
305 小时
阅读权限
90
积分
49853
帖子
74
主题
7
精华
0
UID
38183
发表于 2014-1-13 14:34:41 |显示全部楼层
bikong0411 发表于 2013-11-26 15:07
学学python吧

要做一个pythoner,还是个菜鸟,要在哪个方面开始做起?

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2020-4-1 13:31 , Processed in 0.030841 second(s), 14 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部