今天写了个加密的东西,用到了math.Sqrt求质数,发现用的时间好久,先无论下面的例子算法是否有问题,我就写了个demo寻找10 000 000之内的质数个数,本来这个demo是delphi写的,我把它翻译成其余语言,因而我测试了下几个语言的效率:python
先用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语言输出结果:c#
664581测试
40.5965203s加密
用了40秒左右。翻译
而后我再用网上抄的delphi的这个demo执行了下:code
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;
最终执行结果:orm
0:00:12
664581
delphi 只用了12秒钟,我感到奇怪,GO语言的执行效率应该快于delphi的啊?io
我再用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语言类型转换浪费了大量的时间。