ruby php 性能,用数据阐述Java, Python, Ruby, PHP, C等各语言性能对比

**代码功能:**循环拼接字符串,并替换子字符串

**硬件环境:**Intel Core2 Duo T7500@2.20Ghz CPU; 2 GB RAM; OS Debian GNU/Linux 2.6.32 i686

代码执行时长

0818b9ca8b590ca3270a3433284dd417.png

代码性能对比图

0818b9ca8b590ca3270a3433284dd417.png

最慢: Java gcj (native executable)

较慢: Java (openJDK); Java (Sun); Lua

稍慢: tcl; Javascript (spidermonkey)

较快: Python; Ruby; PHP; C++; Javascript V8; C; Perl5

最快的是Perl,最慢的gcj,你能接受吗?

内存使用情况

0818b9ca8b590ca3270a3433284dd417.png

内存对比图:

0818b9ca8b590ca3270a3433284dd417.png

测试源码:

C (source); Result: C gcc (Debian 4.4.4-1) 4.4.4

#include

#include

#include

#include

int main(){

setbuf(stdout,NULL); //disable output buffering

char *str=malloc(8);

strcpy(str,"abcdefgh");

str=realloc(str,strlen(str)+8);

strcat(str,"efghefgh"); //sprintf(str,"%s%s",str,"efghefgh");

int imax=1024/strlen(str)*1024*4;

printf("%s","exec.tm.sec\tstr.length\n"); //fflush(stdout);

time_t starttime=time(NULL);

char *gstr=malloc(0);

int i=0;

char *pos;

int lngth;

char *pos_c=gstr;

int str_len=strlen(str);

while(i++ < imax+1000){

lngth=strlen(str)*i;

gstr=realloc(gstr,lngth+str_len);

strcat(gstr,str); //sprintf(gstr,"%s%s",gstr,str);

pos_c+=str_len;

pos=gstr;

while(pos=strstr(pos,"efgh")){

memcpy(pos,"____",4);

}

if(lngth % (1024*256)==0){

printf("%dsec\t\t%dkb\n",time(NULL)-starttime,lngth/1024); //fflush(stdout);

}

}

//printf("%s\n",gstr);

}

C++ (source) Result: C++ g++ (Debian 4.4.3-7) 4.4.3

#include

#include

#include

using namespace std;

main ()

{

string str = "abcdefgh";

str += "efghefgh";

int imax = 1024 /str.length() * 1024 *4;

time_t currentTime = time(NULL);

cout << "exec.tm.sec\tstr.length" << endl;

string find= "efgh";

string replace ="____";

string gstr;

int i=0;

int length;

// int end=0; // size_t end=0;

while(i++ < imax +1000){

gstr += str;

gstr = gstr;

size_t start, sizeSearch=find.size(), end=0;

while((start=gstr.find(find,end))!=string::npos){

end=start+sizeSearch;

gstr.replace(start,sizeSearch,replace);

}

length = str.length()*i;

if((length%(1024 * 256))==0){

cout << time(NULL) - currentTime << "sec\t\t" << length/1024 << "kb" << endl;

}

}

// cout << gstr << endl;

return 0;

}

Javascript (source); Results: Javascript (Spidermonkey - Mozilla) 1.8.0 pre-release 1 2007-10-03, Javascript (V8 - Chrome)

#!/usr/local/bin/js

var str = "abcdefgh"+"efghefgh";

var imax = 1024 / str.length * 1024 * 4;

var time = new Date();

print("exec.tm.sec\tstr.length");

var gstr = "";

var i=0;

var lngth;

while (i++ < imax+1000) {

gstr += str;

gstr = gstr.replace(/efgh/g, "____");

lngth=str.length*i;

if ((lngth % (1024*256)) == 0) {

var curdate=new Date();

print(parseInt(((curdate.getTime()-time.getTime())/1000))+"sec\t\t"+lngth/1024+"kb");

}

}

Java (source) Results: Java (OpenJDK) "1.6.0 18", Java (Sun) "1.6.0 16", Java (gcj) (Debian 4.4.3-1) 4.4.3

public class java_test {

public static final void main(String[] args) throws Exception {

String str = "abcdefgh"+"efghefgh";

int imax = 1024 / str.length() * 1024 * 4;

long time = System.currentTimeMillis();

System.out.println("exec.tm.sec\tstr.length\tallocated memory:free memory:memory used");

Runtime runtime = Runtime.getRuntime();

System.out.println("0\t\t0\t\t"+runtime.totalMemory()/1024 +":"+ runtime.freeMemory()/1024+":"+(runtime.totalMemory()-runtime.freeMemory())/1024);

String gstr = "";

int i=0;

int lngth;

while (i++ < imax+1000) {

gstr += str;

gstr = gstr.replaceAll("efgh", "____");

lngth=str.length()*i;

if ((lngth % (1024*256)) == 0) {

System.out.println(((System.currentTimeMillis()-time)/1000)+"sec\t\t"+lngth/1024+"kb\t\t"+runtime.totalMemory()/1024+":"+runtime.freeMemory()/1024+":"+(runtime.totalMemory()-runtime.freeMemory())/1024);

}

}

}

}

Perl5 (source); Result: This is perl, v5.10.1

#!/usr/bin/perl

$|=1; #disable output buffering, this is necessary for proper output through pipe

my $str='abcdefgh'.'efghefgh';

my $imax=1024/length($str)*1024*4; # 4mb

my $starttime=time();

print "exec.tm.sec\tstr.length\n";

my $gstr='';

my $i=0;

while($i++ < $imax+1000){ #adding 1000 iterations to delay exit. This will allow to capture memory usage on last step

$gstr.=$str;

$gstr=~s/efgh/____/g;

my $lngth=length($str)*$i; ## my $lngth=length($gstr); # Perhaps that would be a slower way

print time()-$starttime,"sec\t\t",$lngth/1024,"kb\n" unless $lngth % (1024*256); #print out every 256kb

}

PHP (source); Result: PHP 5.3.1-5 with Suhosin-Patch (cgi-fcgi)

$str="abcdefgh"."efghefgh";

$imax=1024/strlen($str)*1024*4; # 4mb

$starttime=time();

print("exec.tm.sec\tstr.length\n");

$gstr='';

$i=0;

while($i++ < $imax+1000){

$gstr.=$str;

$gstr=preg_replace('/efgh/','____',$gstr);

$lngth=strlen($str)*$i;

if($lngth % (1024*256)==0){

print (time()-$starttime."sec\t\t".($lngth/1024)."kb\n");

}

}

?>

Python3 (source); Result: Python 3.1.3

#!/usr/bin/python3 -u

import re

import time

import sys

str='abcdefgh'+'efghefgh'

imax=1024/len(str)*1024*4 # 4mb

starttime=time.time();

print "exec.tm.sec\tstr.length"

sys.stdout.flush()

gstr=''

i=0

while (i < imax+1000):

i=i+1

gstr+=str

gstr=re.sub('efgh','____',gstr)

lngth=len(str)*i

if(lngth % (1024*256) == 0):

print int(time.time()-starttime),"sec\t\t",(lngth/1024),"kb"

sys.stdout.flush()

Ruby (source); Result: ruby 1.8.7

#!/usr/bin/ruby

$stdout.sync=true;

str='abcdefgh'+'efghefgh';

imax=1024/str.length*1024*4; # 4mb

starttime=Time.new;

print("exec.tm.sec\tstr.length\n");

gstr='';

i=0;

while i < imax+1000

i=i+1;

gstr+=str;

gstr=gstr.gsub(/efgh/, "____")

lngth=str.length*i;

if(lngth % (1024*256)==0)

print(((Time.new-starttime).ceil).to_s+"sec\t\t",(lngth/1024).to_s,"kb\n");

end

end

#puts gstr;

Lua (source); Result: Lua 5.1.4

#!/usr/bin/lua

io.stdout:setvbuf "no"; -- io.flush();

str='abcdefgh'..'efghefgh';

imax=1024/string.len(str)*1024*4; -- 4mb

starttime=os.time();

print "exec.tm.sec\tstr.length";

gstr='';

i=0;

while i < imax+1000 do

i=i+1;

gstr=gstr..str;

gstr=string.gsub(gstr,"efgh","____");

lngth=string.len(str)*i;

if(math.mod(lngth,1024*256)==0) then

print(os.time()-starttime.."sec\t\t"..(lngth/1024).."kb");

end

end

tcl (source); Result: tcl 8.4.19

#!/usr/bin/tclsh

set str "abcdefgh"

append str "efghefgh"

set imax [expr {1024/[string length $str]*1024*4}]

set starttime [clock clicks -milliseconds]

puts "exec.tm.sec\tstr.length";

set gstr ""

set i 0

while {$i

incr i

append gstr $str;

regsub -all {efgh} $gstr ____ gstr

set lngth [expr {[string length $str]*$i}]

if {[expr {$lngth % (1024*256)}] == 0} {

puts "[expr int([expr [clock clicks -milliseconds] - $starttime] / 1000)]sec\t\t[expr {$lngth/1024}]kb"

}

}

exit

结论

各语言随着版本升级,也在不断优化,想要用好每个语言的特性,需要摸透她的脾气,这个需要不断的加深了解。

选语言就像选恋人,情人眼里出西施,你中意的,就是最好的,所以对以上结果别太较真。

rubyPHP的高性能体现在以下几个方面: 1.页面缓存。页面缓存指之前加载过的页面以文件方式缓存在服务器中,在一段时间内再次加载相同页面时无需重新执行页面逻辑直接加载静态页面。rubyPHP的页面缓存是自动进行的,在config/tpl.php中可配置是否启用缓存以及缓存文件的有效期。当然这仅仅是全局设置,在调用视图时可重新指定是否启用缓存以及缓存有效期。 2.SQL缓存。sql缓存指之前执行过的查询sql语句以及他的结果缓存在内存中,在一段时间内用相同的sql语句执行查询操作时不经过数据库直接返回内存中数据rubyPHP使用Redis以键值方式缓存sql语句以及他的对应结果。rubyPHP能够在php7上完美运行。(附:关于windows php7 redis 扩展的下载参照我的另一篇博客:http://blog.csdn.net/fanghailiang2016/article/details/51396649)。rubyPHP重写了mysql_query以及mongo_query方法,在执行查询sql查询语句时会优先加载未过期的缓存数据。与页面缓存类似,sql缓存的全局配置路径为config/redis.php,在具体执行sql语句前可重新执行是否使用缓存以及缓存有效期。 3.读写分离。读写分离是建立在主从同步基础上为了减轻服务器压力,将查询语句转移到从服务器上执行的解决方案。rubyPHP重写了mysql_query,mongo_query函数,除了对查询语句进行内存级缓存的优化,同时也将查询语句放到了从服务器上执行。mysql的主从配置文件路径为config/mysql.php
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值