当前位置:   article > 正文

cgo的效率 golang_Golang 效率初(粗)测

cgo 效率

从接触 Golang 开始,断断续续已有差不多一年左右的时间了,都是业余自己学学看看,尚主要限于语法及语言特性,还没有用它写过实际的项目。

关于 Golang 的语法及语言特性,网上有很多资源可以学习。后面某个时间,我也许会写一篇粗浅的文章,来比较一下 Golang 和 C++、Delphi 甚至 C# 等语言语法方面的特性。

我算是个急性子的人(当然现在好一些了),于是作为码农,显而易见会对“效率”比较敏感。这里的效率不单单指编译器生成的机器码优化程度,也包括编译器的编译速度,所以我对 C++ 兴趣不算大,虽然它是我平时的工作语言。

言归正传。

分别用 Golang、C++、Delphi 写了四个小例子,包括普通的应用场景、字符串(串接)操作及数据密集计算(当然也会涉及到譬如库函数的优化等)。我的电脑软硬件环境为:Win7 64bit,Xeon E3-1230(8核),16G RAM。Golang 版本是 1.3.1 Windows/386,VC 则用的 VS 2012,而 Delphi 则用的 XE6 Update1。VC 和 Delphi 编译设置为 Win32 & Release,Golang 则使用默认配置。

所有测试计量单位均为毫秒(ms)。

首先是计算 π 的例子,代码分别如下。

Golang:

package main

import (

"fmt"

"time"

)

const cNumMax = 999999999

func main() {

sign := 1.0

pi := 0.0

t1 := time.Now()

for i := 1; i < cNumMax+2; i += 2 {

pi += (1.0 / float64(i)) * sign

sign = -sign

}

pi *= 4

t2 := time.Now()

fmt.Printf("PI = %f; Time = %d\n", pi, t2.Sub(t1)/time.Millisecond)

}

C++:

#include "stdafx.h"

#include

#include

int _tmain(int argc, _TCHAR* argv[])

{

const int cNumMax = 999999999;

double sign = 1.0;

double pi = 0;

clock_t t1 = clock();

for (int i = 1; i < cNumMax + 2; i += 2)

{

pi += (1.0f / (double)i) * sign;

sign = -sign;

}

pi *= 4;

clock_t t2 = clock();

printf("PI = %lf; Time = %d\n", pi, t2 - t1);

return 0;

}

Delphi:

program PiCalcer;

{$APPTYPE CONSOLE}

{$R *.res}

uses

System.SysUtils, System.DateUtils;

const

cNumMax = 999999999;

var

Sign: Double = 1.0;

Pi : Double = 0.0;

I : Integer;

T1 : Double;

T2 : Double;

S : string;

begin

T1 := Now;

I := 1;

while I < cNumMax + 2 do

begin

Pi := Pi + (1.0 / I) * Sign;

Sign := -Sign;

I := I + 2;

end;

Pi := Pi * 4;

T2 := Now;

S := Format('PI = %.6f; Time = %d', [Pi, MilliSecondsBetween(T2, T1)]);

Writeln(S);

Readln;

end.

分别执行 10 次,结果如下。

Golang:2038 2028 2036 2024 2034 2015 2034 2018 2024 2018,平均:2026.9;

C++     :2041 2052 2062 2036 2033 2049 2039 2026 2037 2038,平均:2041.3;

Delphi :2594 2572 2574 2584 2574 2564 2575 2575 2571 2563,平均:2574.6。

结果居然很不错,比 VC 还快,而 Delphi,大家都懂,优化向来不是它的“强项”。

然后是个质数生成例子。

Golang:

package main

import (

"fmt"

"time"

)

const cNumMax = 10000000

func main() {

t1 := time.Now()

var nums [cNumMax + 1]int

var i, j int

for i = 2; i < cNumMax+1; i++ {

nums[i] = i

}

for i = 2; i < cNumMax+1; i++ {

j = 2

for j*i < cNumMax+1 {

nums[j*i] = 0

j++

}

}

cnt := 0

for i = 2; i < cNumMax+1; i++ {

if nums[i] != 0 {

cnt++

}

}

t2 := time.Now()

fmt.Println("Time:", t2.Sub(t1), " Count:", cnt)

}

C++:

#include "stdafx.h"

#include

#include

const int cNumMax = 1000

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号