簡體   English   中英

Node.js JSON.parse創建對象與使用getter屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM