今天寫了個加密的東西,用到了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語言類型轉換浪費了大量的時間。