2011-03-23 147 views
2

我不是一個「死硬」的編碼器,我需要一些建議。我應該多久創建一個類的新實例?

我正在開發一個網站,用戶可能會搜索商店或品牌。

我創建了一個類,名爲搜索商店

執行搜索有兩種方式:「jQuery Live Search」「正常搜索」

在2個字符以上輸入的每個字符都會觸發實時搜索。所以如果你輸入5個字符,搜索會執行3次。如果您要查找的商店位於下拉列表中,則可以點擊商店,商店頁面將被加載。

其他搜索是在輸入3個或更多字符後單擊搜索按鈕時。

執行搜索時,都會將下面的代碼執行

$search = new Search(); 
$result = $search->search($_GET); 

每個商店頁面加載$store = new Store()執行時間。

我的問題是這樣的:

假設我得到一個非常成功的網站,我有不要蜘蛛每小時100個用戶。每個用戶至少搜索3次並查看至少5個商店。

這意味着300到900個搜索對象每小時創建500個存儲對象。

創建如此多的新對象是不好還是不好?

我讀過一些關於Singleton,但許多建議反對這一點。

我應該怎麼做才能達到最佳性能?任何特定的設計模式,我應該使用?

+4

創建對象應該是最不關心的問題。我不使用PHP,但是Java和C#都可以每秒創建數十萬個對象(實際上,對於最平凡的對象來說,其實數百萬)。或者考慮像Python這樣的語言,甚至整數是對象*(有些被緩存)。即使拋出兩個因素十,你仍然很安全。所以,請。設計「良好」並*運行績效分析*。 – 2011-03-23 20:40:34

+0

@pst非常好的一點。以表演的名義犯下了很多罪。如果你的代碼編寫的很好,經常重構,你將總是有一個很好的開始做性能調整。你可以做負載測試來發現瓶頸。 – 2011-03-23 20:47:54

+0

@pst - 謝謝。我只是一名前端開發人員,從來不必擔心這些事情。很高興知道創建對象不會窒息服務器。我會盡我所能設計,並在時間到時進行性能測試:) – Steven 2011-03-23 20:53:48

回答

3

我不認爲創建類將成爲您的網站的瓶頸。查看像Zend Framework這樣的MVC框架,並檢查爲每個調用生成多少個類的實例。創建一個類的實例的開銷幾乎沒有,搜索將把熱量放在你的數據庫(假設你使用的是像MySQL這樣的數據庫)。

我建議在用戶停止輸入更多字符後,爲您的jQuery Live搜索使用計時器來執行搜索。如果每次輸入一個字符和當定時器觸發時刷新,你實際上可以搜索。

我認爲一個更大的問題將是你的數據庫。如果您有很多閱讀請求,像memcache這樣的良好緩存層可能會從您的數據庫中獲取一大堆加載。

優化你的數據庫搜索應該是一個很好的措施,以保持高性能。有很多的調整和最佳實踐,以便充分利用你正在使用的數據庫。

作爲prodigitalson建議潛入全文搜索Lucene的評論甚至可能比調整db更有效。

如果Lucene對於你來說有些開銷,你可能想看看Zend_Search_Lucene組件,它執行相同的工作並用php編寫。

+1

要添加到此,您可能需要考慮將搜索完全從數據庫中拉出來,方法是使用Lucene或其他內容對數據庫中的內容進行索引類似。即使這使用了db後端,記錄仍然會與主站點數據庫分離,因此您可以將其移至完全不同的數據庫實例或服務器。你也可能會得到更好的搜索結果... – prodigitalson 2011-03-23 20:33:14

+0

我沒有chaching的經驗。我發現這篇文章,http://net.tutsplus.com/tutorials/php/oo-php5-adding-caching-to-data-access-layer/。我會看看我能否實現這一點 - 除非你有更好的主意? – Steven 2011-03-23 20:35:20

+0

@prodigitalson - 這是一個很好的觀點。我需要提高搜索速度。現在要慢下來。 – Steven 2011-03-23 20:37:14

3

不要通過猜測性能瓶頸來過度複雜化您的設計。創建的對象數量很少會成爲問題。

如果您需要稍後優化,memcached圖層可以幫助您。

+3

我基本上與Mads達成一致。過早優化是開發者的罪惡。不要把自己發展成一個洞,做個聰明的人,但是如果你遇到過這個問題,你可以跨越用戶橋。 此外,爲了清楚起見,您應該關注正在生成的請求數量,這聽起來像是在通過AJAX鍵入2個字符時發生的。您的「搜索」對象是在每次請求時創建和銷燬的,在這種情況下似乎極其微不足道 - 您關心的是帶寬和服務器負載。 – 2011-03-23 20:46:48

0

即使您必須關注這些對象的尺寸,創建大量的對象也不應該成爲應用程序中的性能問題。

不要讓你的設計太複雜,但我認爲singleton模式並不複雜,並不難實現。

因此,如果同一個對象實例可以在來自同一用戶的不同搜索(甚至不同用戶,如果它可能在您的應用程序邏輯內部)被重複使用多次,那麼不要害怕使用單例。它可以節省您的內存,並保留您執行相關錯誤的相關任務,包括執行相同任務的多個對象實例,最終共享資源。

相關問題