Node.js JSON.parse创build对象与getter属性

这在很大程度上是一个“我做得对吗/我怎么能做得更好”这样一个话题,最后还有一些具体的问题。 如果您对以下文本有其他build议/评论,即使我没有专门提出这些问题,也可以随时发表评论。


我有一个MySQL表,我的应用程序的用户,以及一组固定列,也有一个文本列包含一个JSONconfiguration对象。 这是为了存储不能存储在单独列中的variablesconfiguration数据,因为它具有不同的每个用户的属性。 在configuration数据上不需要查找/sorting/任何东西,所以我们决定这是最好的方法。

当从我的Node.JS应用程序(运行在节点0.12.4)上查询数据库时,我将JSON文本分配给一个对象,然后使用Object.defineProperty创build一个getter属性,在需要时分析JSONstring数据并添加它的对象。

代码如下所示:

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; } }); 

我这样实现它,因为parsingJSON会阻塞Node事件循环,而configuration属性只需要大约一半的时间(这是在一个express服务器的中间件函数中),所以这样JSON只会在实际上被parsing需要。 configuration数据本身的范围可以从5到大约50个不同的属性组织在一对嵌套的对象,而不是大量的数据,但仍然不仅仅是几行JSON。

此外,还有三个JSON对象(我只展示了一个,因为它们基本都是相同的,只是其中有不同的数据)。 在不同的场景中,每一个场景都是需要的,但是所有场景都依赖于variables(其中一些来自外部来源),所以在这个function的时候,不可能知道哪些场景是必要的。

所以我有几个关于这个方法的问题,希望大家可以回答。

  • 当使用Object.defineProperty ,会Object.defineProperty对性能产生负面影响?如果是的话,是否有可能会否定从JSON数据中parsing出来的好处?

  • 我是否正确地假设不立即parsingJSON实际上会提高性能? 我们正在寻求不断的大量请求,我们需要快速有效地处理这些请求。

  • 现在,三个JSON数据集来自两个不同的表,JOIN用SQL查询。 这只需要为每个请求执行一个查询,而不是最多四个。 请记住,有些场景中不需要任何JSON数据,而且还需要所有三个数据集都需要的场景(当然也包括场景之间的场景),是否可以改进从表中获取所需的JSON数据,在实际需要其中一个数据集的时候? 我避免了这一点,因为我觉得等待四个独立的SELECT查询执行所花费的时间比等待两个JOINed表的查询要花费更多的时间。

  • 还有其他方法可以提高总体性能吗? (我知道,这是一个主观的问题,但我应该检查的东西的想法/build议是受欢迎的)。 我不打算把JSON数据parsing成一个单独的线程,因为当我们的服务运行在一个虚拟化的单核服务器集群上时,创build一个subprocess只会增加整个CPU使用率,在高负载时更对性能造成更多的负面影响。

注:当我说性能时,主要是指快速高效的吞吐率。 我们更喜欢CPU占用率更高的内存占用量。

我们应该忘记小效率,大约97%的时间:不成熟的优化是万恶之源
Donald Knuth

我从那篇文章中得到什么? 花费太多时间在可疑的结果上进行优化,而不是专注于devise和清晰度。

的确,JSON.parse会阻塞事件循环,但是每个同步调用都会执行 – 这只是代码执行,并不是一件坏事。

根本问题不在于阻塞,而在于阻塞多长时间。 我记得一个Strongloop的教练说10ms是一个很好的经验法则,用于在云端应用程序中调用最大执行时间。 > 10ms是时候开始优化 – 为应用程序在巨大规模。 每个应用程序必须定义该阈值。

那么,懒惰的init会保存多less执行时间? 这篇文章说需要1.5s来parsing一个15MB的jsonstring – 约10,000 B / ms。 3个configuration,每个50个属性,30字节/千字节对= 4500字节 – 大约半毫秒。

当时间到了优化,我会看你有懒惰的init做MySQL调用。 一个configuration只需要50%的时间,它不会阻塞事件循环,并且对db的外部调用绝对会使JSON.parse()变矮。

所有这一切都说:你在做什么并不一定是坏事或错误,但如果整个应用程序充满了这些可疑的优化types,那么如何影响function的添加和维护? 我看到的最大的问题是围绕上市时间而不是速度。 代码复杂性增加了上市时间。

Q1在使用Object.defineProperty时是否会产生负面影响…

看看这个网站的提示。

Q2 :* …不立即parsingJSON实际上会提高性能…

恕我直言:不合理的

Q3现在三个JSON数据集来自两个不同的表格…

大多数数据库查询成本通常是进程外调用和networking数据传输(除非你有一个非常糟糕的架构或configuration)。 所有数据在一个电话是正确的举动。

问题4还有其他方法可以改善整体performance吗?

不可能告诉。 开始的地方是观察到的行为,然后使用Profiler工具来识别罪魁祸首,然后进行代码优化。