分享
  1. 首页
  2. 文章

golang语言中的math库中效率低下,可能是类型转换花费了大量时间?

大洋的顶端 · · 1551 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

今天写了个加密的东西,用到了math.Sqrt求质数,发现用的时间很久,先不管下面的例子算法是否有问题,我就写了个demo寻找10 000 000以内的质数个数,原本这个demo是delphi写的,我把它翻译成其他语言,于是我测试了下几个语言的效率:

先用Go语言翻译了下代码:

func main() {
	t := time.Now()
	sum := 0
	for i := 0; i <= 10000000; i++ {
		if isPrime(i) == true {
			sum = sum + 1
		}
	}
	fmt.Println(sum)
	fmt.Println(time.Now().Sub(t))
}
func isPrime(n int) bool {
	end := int(math.Sqrt(float64(n)))
	for i := 2; i <= end; i++ {
		if n%i == 0 {
			return false
			
		}
	}
	return true
}

上面的GO语言输出结果:

664581

40.5965203s

用了40秒左右。

然后我再用网上抄的delphi的这个demo执行了下:

function isPrime(number: integer): boolean;
var
 iHalf,iCount:integer;
begin
 result:=true;
 iHalf:=Round(SQRT(number));
 for iCount:=2 to iHalf do
 begin
 if (number mod iCount)=0 then
 begin
 result:=false;
 break;
 end;
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i ,sum:integer;
var m:TDateTime;
begin
 m:=((Now)) ;
 sum:=0;
 for i:=0 To 10000000 do
 begin
 if isPrime(i)=True then
 begin
 sum:=sum+1;
 end;
 end;
 Memo1.Lines.Add(TimeToStr(Now-m)) ;
 Memo1.Lines.Add(IntToStr(sum))
end;

最终执行结果:

0:00:12
664581
delphi 只用了12秒钟,我感到奇怪,GO语言的执行效率应该快于delphi的啊?

我再用JAVA再次翻译了下:

public class fdfd {
	public static void main(String[] args) {
		long t = (System.currentTimeMillis());
		int sum = 0;
		for (int i = 0; i <= 10000000; i++) {
			if (isPrime(i)) {
				sum = sum + 1;
			}
		}
		System.out.println(sum);
		System.out.println((float) (System.currentTimeMillis() - t) / 1000);
	}
	public static boolean isPrime(int n) {
		int end = (int) Math.sqrt(n);
		for (int i = 2; i <= end; i++) {
			if (n % i == 0)
				return false;
		}
		return true;
	}

执行结果:

664581
16.632

JAVA只有了16秒钟。

我用python再次翻译了下

def isPrime(n):
 result = True
 end = int(math.sqrt(n) + 1)
 for i in range(2, end):
 if n % i == 0:
 result = False
 
 return result
sumC = 0
t = (time.time())
for i in range(10000000):
 if isPrime(i):
 sumC = sumC + 1
print(sumC)
print((time.time() - t))

发现python很久没有结果,这个也是可以想得到的,毕竟是脚本语言,比不上解释型的语言和编译型的语言。

同时用C#编写了下,大致代码如下

void Button1Click(object sender, EventArgs e)
 { int sum=0;
 TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
 for (int i=0;i<=10000000;i++){
 if (isPrime(i)==true) {
 sum=sum+1;
 }
 }
 TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
 TimeSpan ts3 = ts1.Subtract(ts2).Duration();
 textBox1.Text=sum.ToString()+"\r\n";
 textBox1.Text=textBox1.Text+ts3.ToString();
 }
 bool isPrime(int n) {
 int end= (int) Math.Sqrt(n);
 for (int i=2;i<=end;i++){
 if (n % i==0){
 return false;
 
 }
 }
 return true;
 }
 }

在net3.5下,c#的最终执行效果:

664581
00:00:16.9267274

16秒,大致和JAVA相当。

按道理来说,GO语言中math.sqrt算法上不会和其他语言相差太多的啊,为什么执行效率差别这么大?因此只能猜测可能GO语言类型转换浪费了大量的时间。



有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1551 次点击
5 回复 | 直到 2017年11月01日 08:22:21
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏