`
wyk86485480
  • 浏览: 29173 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

Java, Python, Ruby, PHP, C等语言性能对比

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

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

### 代码执行时长
![代码运行时长](https://static.oschina.net/uploads/img/201511/14142908_AExs.png)

**代码性能对比图**
![代码性能对比图](https://static.oschina.net/uploads/img/201511/14144357_WZxg.png)

最慢: Java gcj (native executable) 
较慢: Java (openJDK); Java (Sun); Lua 
稍慢: tcl; Javascript (spidermonkey) 
较快: Python; Ruby; PHP; C++; Javascript V8; C; Perl5 
最快的是Perl,最慢的gcj,你能接受吗?

### 内存使用情况
![内存使用情况](https://static.oschina.net/uploads/img/201511/14143131_XRkd.png)

**内存对比图:**
![内存对比图](https://static.oschina.net/uploads/img/201511/14150514_3YBp.png)

### 测试源码:

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

~~~.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

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

~~~.cpp
#include <iostream>
#include <string>
#include <time.h>

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)

~~~.javascript
#!/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

~~~.java
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

~~~.perl
#!/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)

~~~.php
<?php


$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

~~~.python
#!/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

~~~.ruby
#!/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

~~~.lua
#!/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

~~~.tcl
#!/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<[expr {$imax+1000}]} {
        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
~~~

### 结论

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

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

转自:http://www.yinqisen.cn/blog-685.html
分享到:
评论

相关推荐

    为什么你一定要学习Python或Ruby语言.pdf

    首先,Python和Ruby相比C/C++/Java等语言,能显著减少代码量。据估计,Python或Ruby的代码行数仅相当于Java代码的五分之一。这意味着使用Python或Ruby可以更快地开发项目,同时也降低了出错的可能性。此外,考虑到一...

    thrift 的 java 和 python结合例子

    总结起来,Thrift是实现跨语言服务调用的强大工具,通过其IDL和生成的代码,开发者可以轻松地在Java和Python等不同语言之间建立高效、可靠的通信。这个例子提供了学习和实践Thrift的一个基础起点,对于理解跨语言...

    各种语言的字符串逆序 Python、JavaScript、Java、C#、C++、Ruby、PHP、Go和Rust等语言

    涵盖了Python、JavaScript、Java、C#、C++、Ruby、PHP、Go和Rust等语言,展示了如何使用各自语言的特性和标准库来反转字符串。 适用人群 编程初学者:正在学习基本的字符串操作。 软件开发者:需要在项目中实现字符...

    生产规模的数据中心分析器CC Go Rust Python Java NodeJS PHP Ruby Perl.zip

    这个压缩包文件"生产规模的数据中心分析器CC Go Rust Python Java NodeJS PHP Ruby Perl.zip"包含了多种编程语言实现的数据中心分析器组件,这表明该工具可能支持跨平台和多语言集成。以下是对这些编程语言在数据...

    Unirest是一个轻量级的HTTP请求库,涵盖Java、PHP、Python、NET等多种语言.rar

    支持 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多种语言。底层是基于httpclient,所以使用Unirest之前先要引入httpclient相关的依赖。 Maven项目可以直接在pom.xml文件中引入Unirest 的依赖 ...

    正则表达式匹配工具——主流的开发语言(C#、Java、C++、VB、Ruby以及Python等)

    那么你会在主流操作系统(*nix[Linux, Unix等]、Windows、HP、BeOS等)、主流的开发语言(delphi、Scala、PHP、C#、Java、C++、Objective-c、Swift、VB、Javascript、Ruby以及Python等)、数以亿万计的各种应用软件...

    学编程选什么语言好?是PHP、Python还是Ruby?

    在互联网上,关于初学者应该选择哪种编程语言的讨论非常热烈,常见的选择有PHP、Python和Ruby。以下是对这三种语言的深入分析以及它们在实际应用中的优劣比较。 首先,PHP是一种广泛使用的服务器端脚本语言,尤其在...

    完全用Python工作---Harness the power of Python

    Python的优势在于其通用性,它可以替代C、C++、Java、Ruby等语言的部分功能,并在许多方面表现出更高的效率和便利性。例如,C语言需要处理复杂的内存管理和指针操作,而Python通过自动内存管理简化了这一过程;C++的...

    基于Python的跨语言兼容性tplmap设计源码资源整合

    该项目是一个基于Python开发的跨语言兼容性工具,名为tplmap,汇集了99个设计源码文件,涵盖Python、Shell、PHP、Java、JavaScript、HTML、Ruby等多种编程语言。其中,Python文件63个,Shell文件8个,PHP文件6个,...

    编程学习,编程语言,php,android,java,c,javascript 编程语言教学,资讯

    整合了各种语言(php,android,c,c++,html,div+css,python,ruby等)在工作和面试中遇到的问题 随时随地的阅读,提高我们的时间碎片利用率 我们在路上...我们不断的学习.

    langs-performance:C ++,Python,Perl,PHP,Java,NodeJS,Go,Ruby,Rust,Swift和D性能基准

    语言性能C ++,Python,Perl,PHP,Java,NodeJS,Go,Ruby,Rust,Swift和D性能基准测试博客文章: 2016年: : 2016年: : 2010-2012年: : 这里的基准测试并没有尽力而为,因为它们从一个方面展示了语言的性能,...

    每个程序员都应该学习使用Python或Ruby

    它们允许程序员用极少的代码行数完成相同功能的程序,相比Java、C++等语言,Python和Ruby的代码量通常只有前者的五分之一。这不仅提高了开发效率,还降低了维护成本。在实际开发中,优秀的程序员能够维护大约2万行...

    Python安装包和安装教程.pdf

    与 Java、PHP、C# 和 Ruby 等语言相比,Python 具有许多优点,使其成为开发者的首选语言。下面是 Python 安装包和安装教程的详细信息。 Python 的优点 1. 简单易学:Python 的语法简单易学,易于初学者上手。 2. ...

    java轻量网络请求JAR包支持unirest-java-1.4.9.jar

    Unirest 是一个轻量级的 HTTP 请求库,涵盖 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多种语言。可发起 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 请求

    强大的Python 完全用Python工作.pdf

    它在C、C++、Java、Ruby等通用语言之间找到了平衡,既能处理常见的编程任务,又具有更高的开发效率。 书中提到了Python对比其他语言的一些优势。例如,相比于C语言,Python免去了指针操作和内存管理的复杂性;与C++...

    2022年最新。Python教程-100天从新手到大师

    DevOps - Python / Shell / Ruby 数据采集 - Python / C++ / Java 量化交易 - Python / C++ / R 数据科学 - Python / R / Julia / Matlab 机器学习 - Python / R / C++ / Julia 自动化测试 - Python / Shell 作为一...

    程序设计语言的选择问题推荐.pdf

    对性能要求高的选择C/C++,跨平台需求则偏向Java,初学者可以从Python或Ruby开始,对系统级编程感兴趣的可以学习C语言。兴趣和市场需求是选择语言的关键,不断学习和适应新技术也是编程生涯的重要部分。

    强大Python完全用Python工作.doc

    Python相较于其他语言,如C、C++、Java和Ruby等,拥有诸多优势。C语言虽然底层且高效,但对内存管理和指针操作要求较高,不适合快速开发。C++的学习曲线陡峭,精通需要大量时间。Java虽然广泛应用,但其面向对象特性...

    JavaBridge下载

    4. **脚本语言与Java的集成**:Python、Ruby等脚本语言可以通过JavaBridge调用Java库,增加其功能和性能。 要使用JavaBridge,首先需要确保你的环境已经正确配置了Java开发环境(JDK)。接着,将"JavaBridge.jar" ...

Global site tag (gtag.js) - Google Analytics