[英]Node.js JSON.parse on object creation vs. with getter property
這很大程度上是一個“我做得對/我該如何做得更好”的主題,最后還有一些具體問題。 如果您對以下文本有其他建議/評論,即使我沒有特別提出這些問題,也請隨時發表評論。
我為我的應用程序的用戶提供了一個MySQL表,以及一組固定列,也有一個包含JSON配置對象的文本列。 這是為了存儲可變配置數據,該數據不能存儲在單獨的列中,因為每個用戶具有不同的屬性。 不需要在配置數據上進行任何查找/訂購/任何操作,因此我們認為這是最好的方法。
從我的Node.JS應用(在Node 0.12.4上運行)查詢數據庫時,我將JSON文本分配給一個對象,然后使用Object.defineProperty創建一個getter屬性,該屬性在需要時解析JSON字符串數據並添加它到對象。
代碼如下:
user =
uid: results[0].uid
_c: results[0].user_config # JSON config data as string
Object.defineProperty user, 'config',
get: ->
@c = JSON.parse @_c if not @c?
return @c
編輯:上面的代碼是Coffeescript,這是與那些不使用Coffeescript的人等效的(近似)JavaScript:
var user = {
uid: results[0].uid,
_c: results[0].user_config // JSON config data as string
};
Object.defineProperty(user, 'config', {
get: function() {
if(this.c === undefined){
this.c = JSON.parse(this._c);
}
return this.c;
}
});
我之所以這樣實現,是因為解析JSON會阻止Node事件循環,而config屬性僅需要大約一半的時間(這在快遞服務器的中間件函數中),因此只有在實際使用JSON時,才對JSON進行解析需要。 配置數據本身的范圍從5到大約50個不同屬性,這些屬性組織在幾個嵌套對象中,不是大量數據,而不僅僅是幾行JSON。
此外,這些JSON對象中有3個(我只顯示了一個,因為它們基本相同,只是其中的數據不同)。 在不同的場景中需要每個場景,但是所有場景都取決於變量(其中一些來自外部資源),因此在此功能的關鍵點上,尚無法知道哪些變量是必需的。
因此,我對這種方法有兩個問題,希望大家能回答。
使用Object.defineProperty
會對性能產生負面影響,如果是,是否有可能抵消不立即解析JSON數據帶來的好處?
我是否假設不立即解析JSON確實會提高性能是否正確? 我們正在尋找數量不斷增加的請求,我們需要快速有效地處理這些請求。
現在,這三個JSON數據集來自在SQL查詢中加入的兩個不同的表。 每個請求只需要執行一個查詢,而不是最多四個。 請記住,在某些情況下不需要使用任何JSON數據,但在某些情況下則需要使用所有三個數據集(當然還有中間的情況),是否可以僅從表中獲取所需的JSON數據來進行改進,何時真正需要其中一個數據集? 我之所以避免這種情況,是因為與等待帶有兩個JOINed表的一個查詢相比,等待四個單獨的SELECT查詢所花費的時間更長。
還有其他方法可以進一步改善整體性能嗎? (我知道,這是一個主觀問題,但是歡迎提出我應該檢查的想法/建議)。 不過,我不希望將JSON數據解析為一個單獨的線程,因為當我們的服務在虛擬化的單核服務器群集上運行時,創建子進程只會增加總體CPU使用率,而在高負載情況下,對性能的負面影響更大。
注意:我所說的性能主要是指快速有效的吞吐率。 與較大的CPU使用率相比,我們更喜歡更大的內存空間。
我們應該忘記效率低下的問題,例如大約97%的時間:過早的優化是萬惡之源
-唐納德·努斯
我從那篇文章中學到什么? 花費太多時間進行可疑結果的優化,而不是專注於設計和清晰度。
的確,JSON.parse會阻止事件循環,但是每個同步調用都可以-這只是代碼執行,不是一件壞事。
根本擔心不是它正在阻塞,而是它阻塞了多長時間。 我記得一個Strongloop講師說過10ms是在雲規模的應用程序中調用的最大執行時間的最佳經驗法則。 > 10ms是開始優化的時候-適用於大規模應用。 每個應用程序都必須定義該閾值。
那么,您的惰性初始化可以節省多少執行時間? 本文說,解析15MB json字符串需要大約1.5秒的時間-大約10,000 B / ms。 3個配置,每個50個屬性,每對30個字節/ kv = 4500個字節-大約半毫秒。
當需要進行優化時,我會考慮讓您的惰性初始化函數來執行MySQL調用。 配置僅需要50%的時間,它不會阻止事件循環,並且對db的外部調用絕對會使JSON.parse()相形見war。
所有這些都是要說的:您所做的不一定是壞事或錯誤,但是,如果整個應用程序充滿了這些可疑的優化類型,那么這對功能添加和維護有何影響? 我看到的最大問題是上市時間,而不是速度。 代碼復雜度增加了上市時間。
Q1 : 使用Object.defineProperty時是否會對性能造成負面影響?
查看此站點以獲取提示。
問題2 :* ...不立即解析JSON實際上會提高性能...
恕我直言:無關緊要
Q3 : 現在,三個JSON數據集來自兩個不同的表...
多數數據庫查詢成本通常是進程外調用和網絡數據傳輸(除非您的架構或配置確實很差)。 一個呼叫中的所有數據都是正確的舉動。
問題4 : 還有其他方法可以改善整體效果
不可能告訴。 首先要觀察到的行為,然后是探查器工具以找出罪魁禍首,然后進行代碼優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.