Calculus

Best Math Test You Bestmathtest T Best Math Test Cs Page 2 Best Math Test Fillano's Learning Notes

Best Math Test You Bestmathtest T Best Math Test Cs Page 2 Best Math Test

search Bestmathtest Best searchF Test lsearcha You o Best Math search Test -1 Test s Best a-1c Test es-1 You s Page a-1csearchesearchesearchr Bestmathtest h Test -1tt-1s Best You Best -1search Best [ Best Javascript學習日誌 ]
(1472) 閱讀(0) 引用(0) 回應 推文( 1 )

熟悉Javascript運作原理的人,應該都知道Javascript的非同步執行,是採用一個單一執行緒的方式,把所有事件放在一個queue裡面依序執行。John Resig的文章:How JavaScript Timers Work,裡面對於這樣的運作方式有相當清楚的解釋。

在John Resig舉的例子中,執行的單位看起來都是一個一個事件處理函數...不過實際運作應該不只是這樣。ECMA-262標準中,對於Javascript的執行,定義了三種Execution Context,分別是global, eval以及function。而像setTimeout/setInterval,第一個參數可以是字串或函數,所以排進event loop中執行的程式就有可能是函數或字串。更進一步來看,我們可以利用在文件head元素動態附加一個script元素來載入Javascript,這個時候程式就會跑在global context。

現在好奇的一點是,如果這三種execution context的code都可以排入event loop,那麼是否event loop裡面的執行單位其實就是execution context呢?來寫個簡單的測試看:

 (閱讀全文)

在msys環境中編譯node-v0.3.7

由 Fillano(馮旭平) 發表於 [ Javascript學習日誌 , 伺服器學習日誌 ]
(2821) 閱讀(0) 引用(1) 回應 推文( 0 )

從node-v0.3.7之後,nodejs支援在MinGW/MSYS環境中編譯:Building node.js on mingw。不過,如果已經安裝了Visual Studio / VC++,會導致V8誤認編譯器,因而出現編譯問題。

我自己有安裝Visual Studio Express,直接用標準的方式編譯同樣會出問題。不過...直接進入deps/v8,透過scons來編譯v8卻非常順利Orz。觀察了一下錯誤訊息,node在編譯v8時,使用的SConstruct檔案似乎不是v8內建的?稍微改一下wscript,在v8的編譯參數加上toolchain=gcc,好像也沒用,直接使用scons也有問題...不過,嘿嘿,把個別編譯好的libv8.a放到build/default裡面就可以編譯過去了。

不過,openssl還是不行,一定要configure --without-ssl...其實在msys底下有安裝openssl阿...這蠻奇怪,調了wscript也不能過XDDD

在windows中編譯mod_bw

由 Fillano(馮旭平) 發表於 [ 伺服器學習日誌 ]
(2351) 閱讀(0) 引用(0) 回應 推文( 0 )

今天看到宗董介紹,回頭再看了一下mod_bw...這個module有點舊了,最新版本是0.7,而且更新日期是在2005年...,不果看起來他支援Apache2.0的模組,所以跟Apache2.2應該相容性還OK。

網站上有已經編譯好的模組可用,但是下載來用時發現,AppServ裡面的httpd無法啟動,看起來是載入這個模組出了問題,只好自己編譯看看了

試了一下,比較快的方式是

  1. 進入httpd-2.2.8(之前編譯過,所以用這個)原始碼目錄中的modules/filters目錄
  2. 把mod_bw原始碼中的mod_bw.c複製到這個目錄
  3. 這篇文章的方式修改mod_bw.c的原始碼
  4. 把mod_filter.mak複製成mod_bw.mak,然後把檔案中的"mod_filter"字串取代成"mod_bw"字串
  5. 進入Microsoft Windows SDK 6.1的console,進入上述目錄,然後用"nmake /f mod_bw.mak"命令進行編譯
  6. 然後把編譯好的mod_bw.so拷貝到httpd模組目錄中,然後做好設定,重啟apache httpd

因為我都用Windows SDK + VC Express來編譯,這樣用apxs反而會產生不正確的設定XD,所以修改Makefile反而比較快...

在windows中編譯httpd-2.2.8的問題

由 Fillano(馮旭平) 發表於 [ 伺服器學習日誌 ]
(1984) 閱讀(0) 引用(0) 回應 推文( 0 )

簡單的筆記,怕自己忘記。至於為啥要編譯這個版本...是因為自己目前用的AppServ是用這個版本。比較新的httpd在windows中編譯應該不會碰到這個問題(ex. 2.2.17)。

關鍵在於這個issue,只要用bugzilla連結中提供的patch來修改apr/include/apr.hw還有apr/network_io/unix/multicast.c就可以通過編譯。(我用的是Windows SDK 6.1,一樣會碰到問題)

functional style的代價

由 Fillano(馮旭平) 發表於 [ Javascript學習日誌 ]
(2528) 閱讀(0) 引用(0) 回應 推文( 0 )

之前在nodejs討論群回覆別人問題,使用了之前文章:用函數處理函數,來擴充函數原本的功能中,讓函數執行特定次數的方法,配合遞迴來解決問題。不過他的問題,其實把直接執行的程式改成函數就可以解了。

我比較好奇的是效能,所以把這兩種寫法拿來測試一下:

<html>
<body>
</body>
</html>
<script>
//global variables... easier for testing
var input = [],output=[];
var input1=[],output1=[];
//limit a function to run n times. will always return null while over the limit
function times(n, f) {}
    if(c<n) {} else {}
  };
}
//the core function for this test.
var work = function(res) {};
//limit the 'work' function to run 10 times
var f1 = times(10, work);
//run recursively for test1
var r1 = function(res, f) {}
};
//run iteratively n times for test2
var r2 = function(n) {}
};
//test1: recursive version, initial global input and output variables then run r1
//the codes within test1 and test2 are almost identical
function test1() {}
//test2: iterative version, initial global input1 and output1 vairables then run r2
function test2() {}
//run each test 100000 times to make the difference of the two tests visible
var count = 100000;
var d1 = new Date().getTime();
for(var i=0; i<count; i++) {}
var d2 = (new Date().getTime()) - d1;
var d3 = new Date().getTime();
for(var i=0; i<count; i++) {}
var d4 = (new Date().getTime()) - d3;
alert(d2);
alert(d4)
</script>

疑?結果用functional風格的寫法,速度竟然比簡單loop的寫法快了三倍左右(在Chrome8。在Opera差距更大,大約五到六倍,其他瀏覽器跟Chrome8差不多。)...我以為用loop會比較快說

嗯,所以...使用Javascript時,適當地搭配functional、recursive的寫法,並不會影響到效能,有時還會更快!


2010-12-10 19:47 補充:

最近跟噗友討論了一下這個問題:p/9gb24a,不過還是有點難確定為什麼速度的差距是這樣。

JSON.stringify以及JSON.parse的效率

由 Fillano(馮旭平) 發表於 [ Javascript學習日誌 ]
(3781) 閱讀(0) 引用(1) 回應 推文( 0 )

之前參加IT邦鐵人賽,在一個沒做出來的例子中,發現某些瀏覽器對從Canvas 2D Context用getImageData取得的CanvasPixelArray做JSON.stringify/JSON.parse速度奇慢,當時只是粗略的測試。為了仔細觀察到底不同瀏覽器的JSON處理效率,我索性做兩個資料來做比對,一個是640x480的CanvasPixelArray,一個是相同結構的Object。

CanvasPixelArray有兩個重要的使用方式,其中,使用length性可以取得他的「陣列」(他不是一個真正的陣列)長度,用數字當作索引,可以取得依照RGBA順序排列的值。所以一個640x480的Canvas,取得的CanvasPixelArray元素個數應該有640x480x4。跟CanvasPixelArray做對照的是一個JSON.stringify後,結果相同的Object。然後測試兩個樣本執行JSON.stringify以及JSON.parse的執行速度。程式如下:

<html>
<head>
<style>
  div {}
</style>
</head>
<body>
<canvas id="canvas" width="640" height="480"></canvas>
<div id="panel"></div>
</body>
</html>
<script>
document.getElementById('panel').innerHTML += 'Preparing CanvasPixelArray for testing...<br>';
var ctx = document.getElementById('canvas').getContext('2d');
var img = ctx.getImageData(0,0,640,480);
document.getElementById('panel').innerHTML += 'Preparing Object for testing...<br>';
var obj = {};
for(var i=0,j=640*480*4; i<j; i++) {}
obj['length'] = 640*480;
function test1() {}
function test2() {}
setTimeout(test1, 100);
function test3() {}
function test4() {}
setTimeout(test3, 3000);
</script>

測試的結果還是讓我蠻訝異的:

雖然只是很粗略的測試,而且只跑一次(所以不夠格當作樣本),但是一些速度的差距太明顯,所以很有意思。 Chrome雖然速度很快,但是他的JSON處理速度有點慘不忍睹(Safari也一樣,但是Safari會警告Javascript執行逾時,測試根本跑不完)。Opera的JSON.parse速度讓人驚艷。Firefox4 Beta7的速度反而不及Firefox 3.6.12。而Firefox 3.6.12處理CanvasPixelArray的速度很明顯地比Object快,這也跟預期不太一樣。

在cygwin中編譯nodejs

由 Fillano(馮旭平) 發表於 [ gBest Math Test You Bestmathtest T Best Math Test Cs Page 2 Best Math Test Fillano's Learning Notesd l Best Math Test sBest Math Test You Bestmathtest T Best Math Test Cs Page 2 Best Math Test Fillano's Learning Notesx d Best Math Test