寫程式有感3

之前都學過下寫 javascript,後來發覺都幾麻煩 (個人習慣問題,不是語言的問題),覺得都係 python 較適合我。

想不到這次為了在網頁上做些東西 (見「繪畫多角星的程式」一文) ,的起心肝去研究了一下。
初頭真是茫無頭緒,無從入手。我懂得建立一個 text file 成為 SVG 檔,但怎樣在網頁表現出來?原來是 DOM object。慢慢發現 document.getElementById() 此功能的強勁,很多時對於 DOM object 的控制都要用到,就此便得心應手。不過在後期被一個小問題糾纏了一些時間。

如果大家用 Google Chrome 瀏灠器 (我用作測試的是 Chromium 21),會在 input box 見到有箭咀可以調校數值,圖像立即更新,這不是動畫效果,而是重新繪畫一幅新的圖像,不過速度很快吧,如果你按實箭咀會有動畫的錯覺。

其實 SVG 也可做到動畫效果,如果有一些像 Flash 的設計介面,相信對美術設計人員會更方便。如果不用動畫,SVG 可以無須寫 code,在 Adobe Illustrator 或 Inkscape 中繪畫出來便可。但要動畫的話,好似還未有合適的軟件,需要一行一行 code 寫出來。但隨著 Flash 的沒落,相信網絡動畫會被 html5+css+javascript+svg 所代替。

好奇一試,如果用 javascript 來計數又會如何?

效果實在出人意表。我安裝了 google 的 javascipt engine,名為 v8。在 v8 的 shell 入面 load 入以下 script:

function wallis(n){
    var partial = 1.0;
 
    for (var i = 1; i <= n; i++){
        partial = partial*(4.0*i*i)/(4.0*i*i - 1);
    }
 
    return 2.0*partial;
}

此程式是用 Wallis Product 求 Pi 的近似值,見 「沃利斯乘積(求 Pi 公式)」一文。
在 v8 的 shell 執行 wallis(1000000),很快,立即出現結果。

同樣地,我寫了以下 python 3程式

def wallis(n):
    partial = 1
 
    for i in range(1, n+1):
        partial = partial*(4.0*i**2)/(4.0*i**2 - 1)
 
    return 2.0*partial

在 python shell 中 import 該script,然後執行,速度比 javascipt 慢得多!

實在令我震驚!以前一直以為 python 是 script 中較快的一種呢。再試試 firefox 個 javascirpt engine,我所用的 linux distribution 沒有提供該 engine 的最新版套件,用舊版來試……慢,比 python 更慢。但 embed 入網頁用 firefox 來試,好快,與 v8 差不多!

果然,有競爭才會有進步,如果沒有 google chrome 的競爭,相信現在 firefox 仍會好似以前咁慢……

好奇試下 C++ 又如何,寫了以下程式

#include <iostream>
#include <iomanip>
#include <cstdlib>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    int n =  atoi(argv[1]);
    long double partial = 1.0;
 
    for (int i = 1; i <=n; i++){
        partial = partial * 4.0*i*i/(4.0*i*i-1);
    }
 
    cout << setprecision(17) << partial*2.0 <<endl;
}

直接用 g++ 來 compile,然後執行程式,效果竟然較 javascript 慢些少!
不過 compile 時做 optimization,加入 " -O3 -march=native",結果速度上和 v8 差不多!(我沒有嚴謹的計時,用秒錶去計,當 n = 1000000000 時,兩者都大約須時22-23秒)

一直以為 C/C++ 執行速度最快,估不到就此程式,javascript 的速度也跟得上!

不過兩者計出來的結果不同,當 n = 1000000000 時,javascript 的結果為 3.1415926370097456,而 C++ 的結果為 3.1415926528048033,C++ 所得的值較接近 Pi 的真確值。

不是甚麼 benchmark 測試,只是針對此一程式在我家的電腦運行的結果。選用甚麼語言,取決於其用途會較為方便。


Add a New Comment
or Sign in as Wikidot user
(will not be published)
- +