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

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

来源:

图片 1
图片 2

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

硬件意况:编程语言拟人化,C等语言性能对比。Intel Core2 Duo T7500@2.20Ghz CPU; 2 GB RAM; OS Debian
GNU/Linux 2.6.32 i686

图片 3
512×512像素,每像素10000个采集样品,英特尔 C++
OpenMP版本渲染时间为18分36秒。推测Ruby版本約需351天。

图片 4

### 代码试行时间长度
![代码运营时间长度]()

代码试行时间长度

图片 5

代码质量相比较图
图片 6

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

前篇博文把一个C++全局光照渲染器移植至C#,比较C++和C#之性质。刊出后,园友们不吝提议箇中难点,比方嗷嗷开采C++实现里的随机发生器选择了比较复杂的周转时函数,产生Visual
C++和速龙C++的巨大差距;赵姐夫发现C#本子用class竟然比struct快等等。修改这么些难点后,园友QiaoJie亦建议,可同期测试C++/CLI,检验其所发生的IL代码,在平等的.Net平台上运转,看看是还是不是比C#优越。多数网络基友也提供了宝贵意见,未能尽录,唯有以全力创作作为答谢。本人陆陆续续移植了C++代码至Java、JavaScript、Lua、Python和Ruby,赵堂弟亦尝试了F#。本文提供测试源代码、测试结果、轻巧分析、以及个人体会。

Java、C++、Python、Ruby、C#、PHP、JavaScript。7つのプログラミング言語を擬人化。プログラミング言語は、みんな若い。(一部言語除く)

**代码品质比较图**
![代码品质比较图]()

内部存款和储蓄器使用情形

图片 7

内部存款和储蓄器比较图:
图片 8

声明

先是,为免误会,再度重复,本测试有其局限,只好测试某一施用、某一兑现的结果,并无法显示编制程序语言及其运转时的汇总质量,亦无意尝试这样做。而实验情形也只限于某机器、某操作系统上,并不全面。而且,本测试只提供运营时刻的结果,不思索、不可比语言/平台间的技巧性和非技术性优缺点,也未有测试运营期内存。世界上的软件应用林林总总,品质须求也全然两样,本测试只供仿照效法。

出于本身先是次采用Python和Ruby,若代码有不当之处,敬请告之。当然也十二分乐见别的意见。

(文/渡辺将人 総研スタッフ/タニー只野)作成日:13.12.06

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

测试源码:

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

#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

#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)

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

<?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

#!/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<[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

测试内容

正文测试程序为三个大局光照渲染器,是二个CPU运算密集的调整台应用程序(console
application),成效详见前文。在前文刊出后,本身举办了一些profiling、优化,并把代码重新格式化。本渲染器除了有恢宏数学生运动算,亦会产生大量不经常对象,并开始展览极多的主意调用(非虚函数)。本测试有别于人工合成的测试(synthetic
tests,譬如个别测试运算、字串操作、输入输出等),是多个有实际用途的程序。

移植时尽大概保证原代码的逻辑,首要采取面向对象范式。优化方面,不举办人口内联函数(inline
function),但优化了有的不须要的重复运算。

翻译:

### 内部存储器使用意况
![内存使用情形]()

结论

各语言随着版本进级,也在不断优化,想要用好各种语言的表征,必要摸透她的心性,这几个供给持续的加深理解。

选语言就像选爱人,恋人眼里出西子,你知足的,正是最佳的,所以对上述结果别太较真。

转自:

测试配置

  • 硬件: Intel Core i7 920@2.67Ghz(4 core, HyperThread), 12GB RAM
  • 操作系统: Microsoft Windows 7 64-bit
测试名称 编译器/解译器 编译/运行选项
VC++ Visual C++ 2008 (32-bit) /Ox /Ob2 /Oi /Ot /GL /FD /MD /GS- /Gy /arch:SSE /fp:fast
VC++_OpenMP Visual C++ 2008 (32-bit) /Ox /Ob2 /Oi /Ot /GL /FD /MD /GS- /Gy /arch:SSE /fp:fast /openmp
IC++ Intel C++ Compiler (32-bit) /Ox /Og /Ob2 /Oi /Ot /Qipo /GA /MD /GS- /Gy /arch:SSE2 /fp:fast /Zi /QxHost
IC++_OpenMP Intel C++ Compiler (32-bit) /Ox /Og /Ob2 /Oi /Ot /Qipo /GA /MD /GS- /Gy /arch:SSE2 /fp:fast /Zi /QxHost /Qopenmp
GCC GCC 4.3.4 in Cygwin (32-bit) -O3 -march=native -ffast-math
GCC_OpenMP GCC 4.3.4 in Cygwin (32-bit) -O3 -march=native -ffast-math -fopenmp
C++/CLI Visual C++ 2008 (32-bit), .Net Framework 3.5 /Ox /Ob2 /Oi /Ot /GL /FD /MD /GS- /fp:fast /Zi /clr /TP
C++/CLI_OpenMP Visual C++ 2008 (32-bit), .Net Framework 3.5 /Ox /Ob2 /Oi /Ot /GL /FD /MD /GS- /fp:fast /Zi /clr /TP /openmp
C# Visual C# 2008 (32-bit), .Net Framework 3.5
*C#_outref Visual C# 2008 (32-bit), .Net Framework 3.5
F#

F# 2.0 (32-bit), .Net Framework 3.5

Java Java SE 1.6.0_17 -server
JsChrome Chrome 5.0.375.86
JsFirefox Firefox 3.6
LuaJIT LuaJIT 2.0.0-beta4 (32-bit)
Lua LuaJIT (32-bit) -joff
Python Python 3.1.2 (32-bit)
*IronPython IronPython 2.6 for .Net 4
*Jython Jython 2.5.1
Ruby Ruby 1.9.1p378

* 见本文最后的”7.更新”一节

渲染的解像度为256×256,每象素作九15遍采集样品。

Java


图片 9有如宫泽贤治的《不畏风云》中出现的、本性木讷的小妞。从小就由于蠢笨和大食量等风味被人家作为笨蛋,从小学入学开端进入田赛和径赛部、持之以恒跑步,在中长跑中时常获得好成绩,给人以活泼的印象。是非常大力的女童。

她的家境并不算好。父亲Sun是有技能的戏剧家,但不善于理财,在她十三虚岁的时候因为憋闷借债积劳成疾而长逝。她被Oracle三叔收养,那时还与谷歌(Google)大伯之间因为对她的扶养权难点而滋生争论并闹上法庭。

在方圆的人都顾忌,正值青春年少期时她在那样的地步下会不会衰退的时候,她却若无其事、继续着每一天练习跑步的活着。

节省的、认真的、难说是精晓的她,进入高级中学后不知是否稍稍早先对异情在意,被人看到她偷偷地球科学着别的女人的时尚穿着在街上行走。固然会蒙受“即使很尽力,恐怕有些有一点点过时”、“这衣裳与Java的影像不合”之类的否认评价,但认为“意各地很萌?”的善意的人也好些个。

喜好喝咖啡,只喝印尼产的。其自身曾说过“喜欢咖啡超越三顿饭”,不禁令人稍稍担忧“那样对正规没难题呢?”

 

**内存比较图:**
![内部存储器相比较图]()

结果及解析

下表中预设的相对时间以最快的单线程测试(IC++)作规范,用鼠标按列可转移规则。由于Ruby运维时刻太长,只每象素作4次采集样品,把日子乘上25。别的,因为各测试的渲染时间距离很远,所以用了多少个棒形图去显得数据,分别呈现时间少于5000秒和轻便60秒的测试(Ruby是五千秒以外,不予展现)。

C++


图片 10细长的两只脚和协和的五官。被过四个人叫作“IT界出类拔萃的名媛”的他,也因为具备插花、茶道、钢琴和小提琴、合气道、剑道、寸拳等等才干而著名。

她的客官好些个很狂热,还留存着“乌黑军团”那样的观者俱乐部。漆黑军团的是规模紧跟于共济会(Freemason)的特大型团体,一般人不知所厝入会。听说只要能回复出对她那多少个纵情的闹饮的难点,就能够有发现到的军团成员来询问“你愿意进入漆黑军团吗?”

与她同父异母的姊妹Objective-C一心专注于弹钢琴,她的瞩目被IT界的天才SteveJobs(也被一些人名为驼色蔷薇)相中,而一跃成为歌手,而C++则是由于其美观和本领被人关切,长年坐稳产业界歌星的宝座。姐妹几个人真可谓是相比较分明。

她依据心理差异往往地转换发型和时装那或多或少也很著名。后天要么和服配黑发,后日却是红Chow Yun Fat特系上场之类的,因为他的变身而使中度的听众欣喜道“啊嘞?前些天是C++小姐吗?”的事也一贯产生。远隔产业界时偷偷平时穿HYSTE凯雷德IC
GLAMOULX570的衣着。

关于她的出身年月日其事务所并不精晓。即便也会有门户于一九八一年一说,本文采纳的是在有的观众中流传甚广的一九八四年七月13日说。其间也沿袭有“她要好大概也忘怀自个儿的德阳……”这样煞有介事的浮言。与其说“C++小姐的话记不清自身的八字也不是何许不敢相信 无法相信的事务”,倒比不上看作是他稚嫩的心性的显现。

 

### 测试源码:

C++/.Net/Java组别

静态语言和动态语言在此测试下的属性不在同一数量级。先相比较静态语言。

C++和.Net的测试结果和上一篇博文相若,而C#和F#无明显分裂。可是,C++/CLI固然一样发出IL,于括管的.Net平台上实行,其渲染时间却只是C#/F#的一半左右。为啥吧?使用ildasm去反汇编C++/CLI和C#的可推行文件后,能够开掘,程序的看好函数Sphere.Intersect()在多少个本子中,C++/CLI版本的代码大小(code
size)为201字节, C#则为125字节!
C++/CLI版本在编写翻译时,已把函数内具备Vec类的主意调用全体内联,而C#本子则应用callvirt调用Vec的不二诀要。估算JIT未有把那函数举行内联,做成那天性子差距。其余,C++/CLI版本使用了值类型,并选用指针(代码中为引用)作参数字传送送。若把C#的本子的Vec方法改写为:

//class Vec
//{
    //public static Vec operator +(Vec a, Vec b)
//}
struct Vec
{
    void Add(ref Vec a, ref Vec b, out Vec c);
}

那么,struct不用GC,同期ref/out不用复制,其品质会相比高。然则代码会变得很羞耻:

// 原来用运算符重载(operator overloading):
a = b * c + d;
// 改用ref/out
Vec e;
Vec.Mul(ref b, ref, c, out e);
Vec.Add(ref e, ref d, out a);

为了保证让语言”平常”的选用办法,本实验不利用这种API风格(更新:插手了C#_outref测试,詳見文末)。

只是,托管代码(C++/CLI)的渲染时间,仅为原生非括管代码(IC++)的1.91倍,个人感觉.Net的JIT已经特别科学。

单向,Java的性质表现相当非凡,只比C++/CLI稍慢一点,Java版本的渲染时间为C#/F#的65%左右。以前一向以为,C#成都百货上千规划会使其属性高于Java,比如C#的方法预设为非虚,Java则预设为虚;又比方说C#支撑struct作值类型(value
type),Java则唯有class引用类型(reference
type),后者必须利用GC。不过,这几个测试呈现,Java
VM应该在JIT中做了大批量优化,测度也应用了内联,本领使其性格逼近C++/CLI。

纯C++方面,速龙 C++编写翻译器最快,Visual
C++慢一丢丢(1.19x),GCC再慢一丝丝(1.32x)。那结果符合自身预期。 IntelC++的OpenMP版本和单线程比较,达5.16加快比(speedup),对于4核Hyper
Threading来讲算是不错的结果。读者若有意思味,也足以自行测试C#
4.0的互相新特色。

网站地图xml地图