教訓是:永遠不要想寫超出自己能力太多的東西,話說當年的CIS gaming project其實就是一次慘痛的教訓了,想當年連Large scale software design、muilthreading和GDI/DirectX都搞不懂的五個熱血高中生就想寫即時戰略....XD
話題扯回來,其實如果只是要做出「堪用」的物件的話,其實現在早就可以收工了。問題就在於效能這個瓶頸上,之前研究如何利用MySQL最有效率的儲存樹狀物件就花了不少時間,用硬幹的方法一個權限查詢就用個10+個SQL query效能上根本不可能接受。但問題不是只有樹狀物件而已,把權限系統的層數和對象抽象化,代價就是SQL變得很難寫,當然用一堆SQL + 一堆迴圈硬寫還是寫得出來,只是效能會爛到不想用,目前的希望是達到一次使用者權限的查詢只需要一次SQL query,這就牽涉到sub query的複雜藝術,更直接牽涉到當年那個介面簡陋無比的SQL物件,要在介面完全向下相容下增加sub query等較複雜的功能是連挑戰都不足以形容的夢魘<=口=>
嚴格而言,一次權限查詢的動作「只」進行一次SQL query都會有人嫌太多(很多OSS就對phpGACL頗嫌)。所以未來還需要針對常見的usage pattern進行優化,比如一次找出某使用者所有的權限然後cache起來,這樣一次SQL可以應付一位使用者所有的查詢,而不是只有一次。除此之外就是細部優化了,php似乎對某些OOP的東西支援的比較糟糕,一個function有沒有throw Exception,效能可以差一二十倍,所以像Exception可能就要考慮未來完成後把它拿掉(至少我自己的物件之間一定不會用Exception溝通,阿物件都我寫的,沒有Exception的缺點其實不大......),除此之外的優化還有不少orz
目前已經把class整個完成,unit testing正在寫,希望能趕快完工啊=口=
全文連結
訂閱:
張貼留言 (Atom)
0 意見:
張貼留言