可以follow Kent Beck, Martin fowler, DHH等大名星,
蠻有趣...
2009年7月13日 星期一
2009年1月7日 星期三
測試PHP中物件屬性的使用記憶體
定義:
new 10000個結果:
C5: 7297.2/7297.3 (kb)
C6: 2766.0/2766.1 (kb)
結論:
初始物件屬性佔用的記憶體與數量有關, 但與內容大小無關.
猜測PHP使用 copy on write 技術, 若內容沒有改變,
所有new出來的物件該屬性會指向相同的位址,
並不會額外配置記憶體,
除非後來修改該內容會另外複製一份記憶體.
此結論推翻先前的建議,
亦即若ORM中的Model屬性永遠不變, 例如(一對多的結構設定),
則額外的記憶體成本很低.
class c5 {
var $a1 = 1;
var $a2 = 2;
var $a3 = 3;
var $a4 = 4;
var $a5 = 5;
var $a6 = 6;
var $a7 = 7;
var $a8 = 8;
var $a9 = 9;
var $a10 = 10;
}
class c6 {
var $a1 = array(
'a1'=>1,
'a1'=>2,
'a1'=>3,
'a1'=>4,
'a1'=>5,
'a1'=>6,
'a1'=>7,
'a1'=>8,
'a1'=>9,
'a1'=>10);
}
new 10000個結果:
C5: 7297.2/7297.3 (kb)
C6: 2766.0/2766.1 (kb)
結論:
初始物件屬性佔用的記憶體與數量有關, 但與內容大小無關.
猜測PHP使用 copy on write 技術, 若內容沒有改變,
所有new出來的物件該屬性會指向相同的位址,
並不會額外配置記憶體,
除非後來修改該內容會另外複製一份記憶體.
此結論推翻先前的建議,
亦即若ORM中的Model屬性永遠不變, 例如(一對多的結構設定),
則額外的記憶體成本很低.
測試PHP中array與物件的使用記憶體
定義:
結果:
*數字: memory_get_usage/memory_get_peak_usage (kb)
結論:
1. 物件比Array佔用的記憶體多.
2. 物件內宣告method不會佔用記憶體(應該只是一個vtable結構).
3. 物件內宣告屬性會佔用記憶體.
所以在開發ORM時, 應該儘量避免宣告屬性,
把必要屬性包裝在method中, 必要時才呼叫method讀取,
在提取大量Model時可有效降低記憶體的使用量.
class c1 {
}
class c2 {
function f1() {}
function f2() {}
function f3() {}
function f4() {}
function f5() {}
}
class c3 {
var $a1;
}
結果:
100 1000 10000
-------------------------------------------------------------------
cl: 85.6/85.8 250.8/250.9 2288.0/2288.1
c2: 85.6/85.8 250.8/250.9 2288.0/2288.1
c3: 89.3/89.4 296.7/296.8 2755.8/2755.9
array: 83.0/85.5 227.1/227.2 1693.4/1693.4
*數字: memory_get_usage/memory_get_peak_usage (kb)
結論:
1. 物件比Array佔用的記憶體多.
2. 物件內宣告method不會佔用記憶體(應該只是一個vtable結構).
3. 物件內宣告屬性會佔用記憶體.
所以在開發ORM時, 應該儘量避免宣告屬性,
把必要屬性包裝在method中, 必要時才呼叫method讀取,
在提取大量Model時可有效降低記憶體的使用量.
測試PHP中Mysql的使用記憶體
結果:
100 1000 10000
---------------------------------------------------------------------
MYSQL_NUM: 187.4/187.5 1294.8/1294.9 12394.0/12394.1
MYSQL_ASSOC: 188.2/188.2 1302.7/1302.7 12472.2/12472.2
MYSQL_BOTH: 250.6/250.6 1927.6/1927.6 18722.1/18722.2
MYSQL_OBJ: 191.0/191.1 1326.6/1326.6 13067.5/13067.5
*數字: memory_get_usage/memory_get_peak_usage (kb)
結論:
mysql_fetch_object與mysql_fetch_array所佔用的記憶體差不多.
2008年12月29日 星期一
介紹一種詭異的PHP動態include 方式
在PHP中, 引用外部檔語法如下:
若定義一個function傳回字串, 可以寫成:
若定義一個class, 利用magic method, 可以寫成:
因為還要多一個new的動作, 包裝一下, 最後就變成:
好吧, 連我自己都覺得有點變態...
這麼做有什麼好處 ?
因為我用過幾個PHP的template engine(例如smarty),
template engine的好處很多,
但是最令我無法忍受的是變數要手工一個個assign實在非常愚蠢.
英文叫: Repeat yourself!
其中牽涉到變數scope的問題, 利用上述技巧可以避開繁瑣的Assign.
打的有點累, 實做細節有機會再詳述.
include 'xxx.php';
若定義一個function傳回字串, 可以寫成:
function A() {
return 'xxx.php';
}
include A();若定義一個class, 利用magic method, 可以寫成:
class B() {
function __toString() {
return 'xxx.php';
}
}
$B = new B;
include $B;因為還要多一個new的動作, 包裝一下, 最後就變成:
function C() {
$B = new B;
return $B;
}
include C();好吧, 連我自己都覺得有點變態...
這麼做有什麼好處 ?
因為我用過幾個PHP的template engine(例如smarty),
template engine的好處很多,
但是最令我無法忍受的是變數要手工一個個assign實在非常愚蠢.
英文叫: Repeat yourself!
其中牽涉到變數scope的問題, 利用上述技巧可以避開繁瑣的Assign.
打的有點累, 實做細節有機會再詳述.
幾個令人厭煩的PHP語法
1. 變數之前要有$符號 , 例: $foo
2. 物件屬性前要加$this, 例: $this->foo
3. 建構子不會自動呼叫父類別, 一定要用parent::__construct()方式解決
其它想到再補上...
上述種種會莫名其妙多打很多字, 讓程式碼變的很噁.
哪裡噁? 對我而言那些都是干擾.
以前對於 xxUnit裡面定義那麼多assertEqual,
assertNull一堆驗證方法總覺得納悶,
明明一個 assert(a==b)就搞定的事偏偏,
要多定義一個assertEqual(a, b),
不是擺明要考驗programmer的記憶力.
但程式寫久了, 漸漸覺得過長的變數或符號會造成干擾,
遮蔽其中的邏輯, 簡單的說程式越短越好寫, 越不容易出錯.
2. 物件屬性前要加$this, 例: $this->foo
3. 建構子不會自動呼叫父類別, 一定要用parent::__construct()方式解決
其它想到再補上...
上述種種會莫名其妙多打很多字, 讓程式碼變的很噁.
哪裡噁? 對我而言那些都是干擾.
以前對於 xxUnit裡面定義那麼多assertEqual,
assertNull一堆驗證方法總覺得納悶,
明明一個 assert(a==b)就搞定的事偏偏,
要多定義一個assertEqual(a, b),
不是擺明要考驗programmer的記憶力.
但程式寫久了, 漸漸覺得過長的變數或符號會造成干擾,
遮蔽其中的邏輯, 簡單的說程式越短越好寫, 越不容易出錯.
2008年11月30日 星期日
關於英語能力的兩三事
常有朋友提起英語能力很重要的話題.
根據我每個月至少接兩三個外國訂單的心得,
外國人找台灣人做生意的原因不外乎兩點:
1. 價格便宜
2. 技術好
很少聽過因為英語能力好接到單,
而且據經驗非英語系的外國人英文也很破...
基本上我不反對加強英語能力, 但謹記, 技術才是最重要的, 其他的都只是加分.
根據我每個月至少接兩三個外國訂單的心得,
外國人找台灣人做生意的原因不外乎兩點:
1. 價格便宜
2. 技術好
很少聽過因為英語能力好接到單,
而且據經驗非英語系的外國人英文也很破...
基本上我不反對加強英語能力, 但謹記, 技術才是最重要的, 其他的都只是加分.
訂閱:
意見 (Atom)