Javascript 为什么lodash中的u0.defaults()会占用大量cpu时间?

Javascript 为什么lodash中的u0.defaults()会占用大量cpu时间?,javascript,node.js,lodash,v8,Javascript,Node.js,Lodash,V8,我在production env中的应用程序中发现了一个性能问题。为了重现这个问题,我用本地语言编写了一个示例代码。我从pro env下载了数据,并使用V8 profiling运行了示例。最后我发现lodash中的copyObject()占用了最多的cpu时间。下面是V8 profiling屏幕截图 这是copyObject func的源代码: function copyObject(source, props, object, customizer) { var isNew = !obj

我在production env中的应用程序中发现了一个性能问题。为了重现这个问题,我用本地语言编写了一个示例代码。我从pro env下载了数据,并使用V8 profiling运行了示例。最后我发现lodash中的copyObject()占用了最多的cpu时间。下面是V8 profiling屏幕截图

这是copyObject func的源代码:

function copyObject(source, props, object, customizer) {
  var isNew = !object;
  object || (object = {});

  var index = -1,
      length = props.length;

  while (++index < length) {
    var key = props[index];

    var newValue = customizer
      ? customizer(object[key], source[key], key, object, source)
      : undefined;

    if (newValue === undefined) {
      newValue = source[key];
    }
    if (isNew) {
      baseAssignValue(object, key, newValue);
    } else {
      assignValue(object, key, newValue);
    }
  }
  return object;
}
我的问题是copyObject func中的哪种方法导致的cpu时间最多?这正常吗?谢谢

通过观察,我看到了一些缓慢的事情

  • 它使用Array.prototype.forEach在对象数组上循环。forEach的速度很慢,创建了一个新的函数作用域
  • 然后,它从对象中生成一个对象,以便在其关键帧上循环。object()对您来说是浪费cpu,然后使用for in循环键也是非常慢的
  • 最后,它会执行值检查以及hasOwnProperty检查,这两项检查都浪费在您身上
  • 一般来说,当您了解结构时,最好编写自己的set、clone、copy和default函数,因为直接赋值比其他任何操作都要快

    注意:小心使用双管道(| |),因为0可能是一个OK值,但0 | | 1==1。其他值也遵循此规则。只要做一个if(或?:)语句,你就会更安全。

    通过观察,我看到了一些缓慢的事情

  • 它使用Array.prototype.forEach在对象数组上循环。forEach的速度很慢,创建了一个新的函数作用域
  • 然后,它从对象中生成一个对象,以便在其关键帧上循环。object()对您来说是浪费cpu,然后使用for in循环键也是非常慢的
  • 最后,它会执行值检查以及hasOwnProperty检查,这两项检查都浪费在您身上
  • 一般来说,当您了解结构时,最好编写自己的set、clone、copy和default函数,因为直接赋值比其他任何操作都要快


    注意:小心使用双管道(| |),因为0可能是一个OK值,但0 | | 1==1。其他值也遵循此规则。只需做一个if(或?:)语句,您就会更安全。

    另外,如果您使用的是现代JS,那么myObj={…默认值,…myObj}可能会更快,但没有在jsperf上检查。谢谢!答案很有用,注意:)另外,如果您使用的是现代JS,那么myObj={…默认值,…myObj}可能会更快,但没有在jsperf上检查过。谢谢!答案和注释都很有用:)
    const res = {
      'key1': object.key1 || source1.key1 || source2.key1,
      'key2': object.key2 || source1.key2 || source2.key2,
      'key3': object.key3 || source1.key3 || source2.key3,
    }