前端对象存储优化 之隐藏类优化

隐藏类介绍
隐藏类(Hidden Classes)优化是V8引擎对于JavaScript对象存储的一大优化点,其主要目的是优化对象属性访问和存储,降低计算成本。

隐藏类充当了对象属性的结构描述,将属性名与其在对象中的偏移量关联起来。这样一来,在需要访问对象的某个属性时,可以快速找到这个属性的具体位置,从而大大提升了访问速度。

在JavaScript构造函数内按照一定的顺序初始化对象成员,可以使得它们共享隐藏类,从而提升代码的执行效率。此外,为了避免生成新的隐藏类,应尽量避免在对象创建后继续添加新的属性。
优化隐藏类
以下是一些关于前端对象存储优化的建议:
优化隐藏类来提高JavaScript对象的属性访问速度的原理在于,V8引擎为每个对象都创建了隐藏类,即当您在JavaScript中创建一个新对象时,随之也创建了一个隐藏类。当向对象添加属性时,V8引擎更新该对象的隐藏类,并创建一个新的隐藏类来代表新的属性配置。

  1. 始终以相同的顺序初始化对象成员。这样可以使得多个对象能够共享隐藏类,以及之后与隐藏类相关的优化代码。

  2. 在构造函数中设置所有成员。这样一来,V8可以在实例化过程中就生成完整的隐藏类,而不需要在之后强制更换。

  3. 尽量避免在实例化后向对象添加新的属性。这样做会导致隐藏类的改变,从而使得之前为原隐藏类优化的代码变得无效。

  4. 尽量避免删除对象的属性。这同样会导致隐藏类的改变。

以下是如何优化隐藏类以提高属性访问速度的一些方法:

  1. 始终以相同的顺序实例化对象成员:
    如果有两个类似的对象,并且他们以相同的属性顺序实例化对象成员,那么他们将会共享同一个隐藏类,从而使访问更加高效。

    例如:

  function getType(firstName, lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
    }
    const type = new getType('John', 'Doe');
    const types = new getType('Jane', 'Doe');
   //在以上代码中,type 和 types 对象共享同一个隐藏类。
    let a = {}
	a.name = "a"
	a.age  = 1
	let b = {}
	b.name = "b"
	b.age  = 2
	let c = {}
	c.age = 3
	c.name = "c" 
	//在以上代码中,a 和 b 对象共享同一个隐藏类。避免在定义对象的时候,在已有 a基类的基础上,修改c类型的赋值顺序,原因下面会说一下
  1. 在构造函数中设置所有成员:
    错开添加的属性可能导致隐藏类的改变,这会阻碍后续的属性查找。我们应该尽可能地在构造函数中声明所有的成员。

    例如:

 function getType(firstName, lastName, age) {
      this.firstName = firstName;
      this.lastName = lastName;
      this.age = age || 0;
    }
在这段代码中,age 属性会在构造函数调用的时候添加,而不需要在后续调用的时候才去新增。
  1. 避免修改对象的属性结构:
    如果你频繁改变对象的属性,如添加、删除属性,系统需要不断地为其创建新的隐藏类,这会导致引擎放弃对该对象的优化,因此耗费性能。在创建对象后,尽可能保持对象的结构不变,以实现最大化的访问速度优化。
const getType = new getType('Micheal','Scott', 30);
getType.age = 40;  
getType.occupation = 'Manager'; 

通过合理、高效地使用隐藏类,我们可以大大提高代码的性能。这是V8和许多其他JavaScript引擎在处理JavaScript对象时的一种重要优化技术

V8引擎的"inlining"(内联)和"Inline Caching"(内联缓存)是两种优化对象存储和访问的关键技术。

Inlining
内联是一种性能优化技术,在V8引擎中,可以将一个函数的代码插入到另一个函数的调用点。如果轻量级函数频繁地在另一代码片段中被调用,那么在编译阶段,V8会尝试将轻量级函数“内联”到调用它的那部分代码中,这样就避免了函数调用开销(如建立堆栈帧等)。这使得代码执行更加快速和高效。

Inline Caching
内联缓存(Inline Caching,简称IC)是一个可以优化属性访问和函数调用的技术。内联缓存的原理基于这样一个观察结果:对同一函数的重复调用或对同一对象属性的频繁访问通常在同类型的对象上发生。因此,可以将该对象类型的相关信息缓存起来。当再次发生相同的函数调用或属性访问时,可以直接从缓存中读取信息,而不必再进行完全的查找过程。

关于内联缓存,我们可以根据对象的“形状”(也即隐藏类)做优化。判断依据是若两个对象的隐藏类(或者说形状)相同,那么他们的属性访问和方法调用的模式也极可能相同。因此,V8引擎会为这类调用路径缓存关于目的地(如属性的具体存储位置)的信息,极大地提升了执行效率。

V8引擎通过隐藏类来判断对象的形状(或称作结构)。每个JavaScript对象在V8中都关联了一个隐藏类。隐藏类保存了对象的形状信息,以及从属性名称到属性索引的映射。当添加新的属性到对象时,V8会创建一个新的隐藏类并通过back_pointer指针指向老的隐藏类,新的隐藏类中只记录进行了变更的属性信息,随后对象指向隐藏类的指针会指向新的隐藏类。

比如有以下代码:
function Point(x, y) {
this.x = x;
this.y = y;
}

var point = new Point(1, 2);
当V8执行到这段代码时,会先为point对象创建一个隐藏类,在V8中,隐藏类也被称为map,每个对象都有一个map属性,其值指向内存中的隐藏类。隐藏类描述了对象的属性布局,主要包括了属性名称和每个属性所对应的偏移量,比如point对象的隐藏类就包括了x和y属性,x和y属性的偏移量会存储在隐藏类中。当我们要读取对象的属性时,V8会查看对象的map,通过属性的名称找到其在对象中的偏移量,从而直接读取到属性的值。

如果两个对象的形状是相同的,V8就会为其复用同一个隐藏类,这样有两个好处:

  1. 减少隐藏类的创建次数,也间接加速了代码的执行速度;
  2. 减少了隐藏类的存储空间。

因此,V8引擎通过对隐藏类的优化,并根据对象的形状信息来进行决策,从而提升了对象属性的访问速度。

这三个技术的关系,简单来说,就是"Hidden Classes"提供了对象属性的快速访问,"Inline Caching"提供了方法调用结果的快速获取,而"inlining"则减少了函数调用的时间开销。它们共同作用,使得V8引擎能够高效地执行JavaScript代码。

下面再介绍一下利用node.js 进行性能分析

  1. 使用内置的–prof选项

这是一个简单的方法来分析你的Node.js应用的性能。你只需要在启动你的应用时加上–prof参数即可。

例如: node --prof your-script.js

然后你的应用就会开始运行并记录性能数据。运行结束后,会在当前目录生成一个名为isolate-0xnnnnnnnnnnnn-v8.log的 V8 profiler输出文件。

接着你可以使用–prof-process选项来处理这个输出文件,并打印出一个可读的性能报告:

node --prof-process isolate-0xnnnnnnnnnnnn-v8.log

在运行 node --prof-process isolate-0xnnnnnnnnnnnn-v8.log 命令后,性能报告会直接输出在你的命令行界面(Console)。

这份报告中会包含各种信息,其中最重要的部分是每个函数的执行次数,它们占用的CPU时间,以及它们的调用关系。下面是一些主要部分的说明:

Summary

这部分包含了一些统计信息,比如总的样本数量(即性能监测点的数量),还有每个函数执行消耗的 CPU 时间。

Bottom up (heavy) profile

这是报告的主要部分,列出了所有的函数以及它们在 CPU 时间消耗方面的排序。 第一列是百分比,表示该函数占总 CPU 时间的百分比;第二列是该函数自身消耗的 CPU 时间;第三列是该函数以及它所有调用者一共消耗的 CPU 时间。

通过查看这部分内容,你可以发现哪些函数占用了大部分的CPU时间,这就是可能的性能瓶颈点。
下面是运行的案例

Statistical profiling result from isolate-0x7fb63bd00000-18003-v8.log, (79 ticks, 1 unaccounted, 0 excluded).

 [Shared libraries]:
   ticks  total  nonlib   name
      4    5.1%          /usr/lib/system/libsystem_malloc.dylib
      1    1.3%          /usr/lib/system/libsystem_c.dylib
      1    1.3%          /usr/lib/libobjc.A.dylib
      1    1.3%          /usr/lib/libc++.1.dylib

 [JavaScript]:
   ticks  total  nonlib   name

 [C++]:
   ticks  total  nonlib   name
     26   32.9%   36.1%  T __ZN4node13native_module15NativeModuleEnv15CompileFunctionERKN2v820FunctionCallbackInfoINS2_5ValueEEE
     23   29.1%   31.9%  t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
      7    8.9%    9.7%  T _mach_port_get_attributes
      4    5.1%    5.6%  T ___pthread_init
      3    3.8%    4.2%  T __ZN4node7binding18GetInternalBindingERKN2v820FunctionCallbackInfoINS1_5ValueEEE
      2    2.5%    2.8%  T __ZN4node7TTYWrap3NewERKN2v820FunctionCallbackInfoINS1_5ValueEEE
      1    1.3%    1.4%  t __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
      1    1.3%    1.4%  t __ZN4node6Buffer12_GLOBAL__N_111StringSliceILNS_8encodingE1EEEvRKN2v820FunctionCallbackInfoINS4_5ValueEEE
      1    1.3%    1.4%  t __ZN4node2fsL5LStatERKN2v820FunctionCallbackInfoINS1_5ValueEEE
      1    1.3%    1.4%  T _mach_make_memory_entry_64
      1    1.3%    1.4%  T __ZN2v88internal5Scope29AllocateScopeInfosRecursivelyINS0_7IsolateEEEvPT_NS0_11MaybeHandleINS0_9ScopeInfoEEE
      1    1.3%    1.4%  T __ZN2v88internal15AstValueFactory11InternalizeINS0_7IsolateEEEvPT_

 [Summary]:
   ticks  total  nonlib   name
      0    0.0%    0.0%  JavaScript
     71   89.9%   98.6%  C++
      2    2.5%    2.8%  GC
      7    8.9%          Shared libraries
      1    1.3%          Unaccounted

 [C++ entry points]:
   ticks    cpp   total   name
     33   57.9%   41.8%  T __ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE
     24   42.1%   30.4%  t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE

 [Bottom up (heavy) profile]:
  Note: percentage shows a share of a particular caller in the total
  amount of its parent calls.
  Callers occupying less than 1.0% are not shown.

   ticks parent  name
     26   32.9%  T __ZN4node13native_module15NativeModuleEnv15CompileFunctionERKN2v820FunctionCallbackInfoINS2_5ValueEEE
     26  100.0%    T __ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE
     26  100.0%      LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
     26  100.0%        LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      2    7.7%          LazyCompile: ~setupPrepareStackTrace internal/bootstrap/node.js:254:32
      2  100.0%            Eval: ~<anonymous> internal/bootstrap/node.js:1:1
      2    7.7%          Eval: ~<anonymous> stream.js:1:1
      2  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      2    7.7%          Eval: ~<anonymous> internal/source_map/source_map_cache.js:1:1
      2  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      2    7.7%          Eval: ~<anonymous> internal/process/esm_loader.js:1:1
      2  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      2    7.7%          Eval: ~<anonymous> events.js:1:1
      2  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      2    7.7%          Eval: ~<anonymous> buffer.js:1:1
      2  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          LazyCompile: ~setupBuffer internal/bootstrap/node.js:302:21
      1  100.0%            Eval: ~<anonymous> internal/bootstrap/node.js:1:1
      1    3.8%          LazyCompile: ~initializeCJSLoader internal/bootstrap/pre_execution.js:427:29
      1  100.0%            LazyCompile: ~prepareMainThreadExecution internal/bootstrap/pre_execution.js:21:36
      1    3.8%          LazyCompile: ~createWritableStdioStream internal/bootstrap/switches/is_main_thread.js:41:35
      1  100.0%            LazyCompile: ~getStdout internal/bootstrap/switches/is_main_thread.js:120:19
      1    3.8%          Eval: ~<anonymous> tty.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> net.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> internal/timers.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> internal/streams/readable.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> internal/streams/pipeline.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> internal/process/task_queues.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> internal/modules/esm/loader.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> internal/modules/esm/get_source.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> internal/bootstrap/node.js:1:1
      1    3.8%          Eval: ~<anonymous> internal/blob.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    3.8%          Eval: ~<anonymous> fs.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27

     23   29.1%  t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
     11   47.8%    t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
      1    9.1%      LazyCompile: ~value internal/console/constructor.js:303:20
      1  100.0%        LazyCompile: ~value internal/console/constructor.js:324:20
      1  100.0%          LazyCompile: ~log internal/console/constructor.js:362:6
      1  100.0%            t __ZN4node9inspector12_GLOBAL__N_120InspectorConsoleCallERKN2v820FunctionCallbackInfoINS2_5ValueEEE
      1    9.1%      LazyCompile: ~tryReadSync fs.js:378:21
      1  100.0%        LazyCompile: ~readFileSync fs.js:390:22
      1  100.0%          LazyCompile: ~Module._extensions..js internal/modules/cjs/loader.js:1094:37
      1  100.0%            LazyCompile: ~Module.load internal/modules/cjs/loader.js:938:33
      1    9.1%      LazyCompile: ~realpathSync fs.js:1722:22
      1  100.0%        LazyCompile: ~toRealPath internal/modules/cjs/loader.js:361:20
      1  100.0%          LazyCompile: ~Module._findPath internal/modules/cjs/loader.js:462:28
      1  100.0%            LazyCompile: ~resolveMainPath internal/modules/run_main.js:12:25
      1    9.1%      LazyCompile: ~readPackage internal/modules/cjs/loader.js:258:21
      1  100.0%        LazyCompile: ~readPackageScope internal/modules/cjs/loader.js:289:26
      1  100.0%          LazyCompile: ~shouldUseESMLoader internal/modules/run_main.js:27:28
      1  100.0%            LazyCompile: ~executeUserEntryPoint internal/modules/run_main.js:69:31
      1    9.1%      LazyCompile: ~patchProcessObject internal/bootstrap/pre_execution.js:76:28
      1  100.0%        LazyCompile: ~prepareMainThreadExecution internal/bootstrap/pre_execution.js:21:36
      1  100.0%          Eval: ~<anonymous> internal/main/run_main_module.js:1:1
      1    9.1%      LazyCompile: ~makeNodeErrorWithCode internal/errors.js:307:31
      1  100.0%        LazyCompile: ~E internal/errors.js:343:11
      1  100.0%          Eval: ~<anonymous> internal/errors.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    9.1%      LazyCompile: ~formatRaw internal/util/inspect.js:777:19
      1  100.0%        LazyCompile: ~formatValue internal/util/inspect.js:708:21
      1  100.0%          LazyCompile: ~inspect internal/util/inspect.js:265:17
      1  100.0%            LazyCompile: ~formatWithOptionsInternal internal/util/inspect.js:1864:35
      1    9.1%      LazyCompile: ~debuglog internal/util/debuglog.js:70:18
      1  100.0%        Eval: ~<anonymous> internal/source_map/source_map_cache.js:1:1
      1  100.0%          LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%            LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1    9.1%      LazyCompile: ~SafeSet internal/per_context/primordials.js:353:16
      1  100.0%        Eval: ~<anonymous> internal/bootstrap/loaders.js:1:1
      1    9.1%      Eval: ~<anonymous> stream.js:1:1
      1  100.0%        LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%          LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%            Eval: ~<anonymous> net.js:1:1
      1    9.1%      Eval: ~<anonymous> internal/bootstrap/node.js:1:1
      1    4.3%    LazyCompile: ~removeColors internal/util.js:70:22
      1  100.0%      LazyCompile: ~isBelowBreakLength internal/util/inspect.js:1714:28
      1  100.0%        LazyCompile: ~reduceToSingleString internal/util/inspect.js:1738:30
      1  100.0%          LazyCompile: ~formatRaw internal/util/inspect.js:777:19
      1  100.0%            LazyCompile: ~formatValue internal/util/inspect.js:708:21
      1    4.3%    LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%      Eval: ~<anonymous> internal/bootstrap/node.js:1:1
      1    4.3%    LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%      LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%        Eval: ~<anonymous> internal/url.js:1:1
      1  100.0%          LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%            LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1    4.3%    Eval: ~<anonymous> vm.js:1:1
      1  100.0%      LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%        LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%          Eval: ~<anonymous> internal/modules/cjs/loader.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1    4.3%    Eval: ~<anonymous> internal/console/constructor.js:1:1
      1  100.0%      LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%        LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%          Eval: ~<anonymous> internal/console/global.js:1:1
      1  100.0%            LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27

      7    8.9%  T _mach_port_get_attributes
      2   28.6%    t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
      1   50.0%      LazyCompile: ~afterWriteDispatched internal/stream_base_commons.js:151:30
      1  100.0%        LazyCompile: ~writeGeneric internal/stream_base_commons.js:143:22
      1  100.0%          LazyCompile: ~Socket._writeGeneric net.js:772:42
      1  100.0%            LazyCompile: ~Socket._write net.js:809:35
      1   50.0%      Eval: ~<anonymous> internal/process/execution.js:1:1
      1  100.0%        LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%          LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%            Eval: ~<anonymous> internal/bootstrap/node.js:1:1

      4    5.1%  T ___pthread_init

      4    5.1%  /usr/lib/system/libsystem_malloc.dylib
      4  100.0%    t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
      1   25.0%      LazyCompile: ~startListeningIfSignal internal/process/signal.js:21:32
      1  100.0%        LazyCompile: ~emit events.js:349:44
      1  100.0%          LazyCompile: ~_addListener events.js:428:22
      1  100.0%            LazyCompile: ~addListener events.js:496:58
      1   25.0%      LazyCompile: ~prepareMainThreadExecution internal/bootstrap/pre_execution.js:21:36
      1  100.0%        Eval: ~<anonymous> internal/main/run_main_module.js:1:1
      1   25.0%      Eval: ~<anonymous> net.js:1:1
      1  100.0%        LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%          LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%            Eval: ~<anonymous> tty.js:1:1
      1   25.0%      Eval: ~<anonymous> internal/util/inspect.js:1:1
      1  100.0%        LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%          LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1  100.0%            Eval: ~<anonymous> events.js:1:1

      3    3.8%  T __ZN4node7binding18GetInternalBindingERKN2v820FunctionCallbackInfoINS1_5ValueEEE
      3  100.0%    T __ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE
      3  100.0%      LazyCompile: ~internalBinding internal/bootstrap/loaders.js:138:45
      1   33.3%        Eval: ~<anonymous> internal/util.js:1:1
      1  100.0%          LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%            LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1   33.3%        Eval: ~<anonymous> internal/fs/watchers.js:1:1
      1  100.0%          LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%            LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29
      1   33.3%        Eval: ~<anonymous> internal/async_hooks.js:1:1
      1  100.0%          LazyCompile: ~compileForInternalLoader internal/bootstrap/loaders.js:273:27
      1  100.0%            LazyCompile: ~nativeModuleRequire internal/bootstrap/loaders.js:306:29

      2    2.5%  T __ZN4node7TTYWrap3NewERKN2v820FunctionCallbackInfoINS1_5ValueEEE
      2  100.0%    T __ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE
      2  100.0%      LazyCompile: ~WriteStream tty.js:85:21
      2  100.0%        LazyCompile: ~createWritableStdioStream internal/bootstrap/switches/is_main_thread.js:41:35
      2  100.0%          LazyCompile: ~getStdout internal/bootstrap/switches/is_main_thread.js:120:19
      2  100.0%            LazyCompile: ~get internal/console/constructor.js:206:14

      1    1.3%  t __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m

      1    1.3%  t __ZN4node6Buffer12_GLOBAL__N_111StringSliceILNS_8encodingE1EEEvRKN2v820FunctionCallbackInfoINS4_5ValueEEE
      1  100.0%    T __ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE
      1  100.0%      LazyCompile: ~slice buffer.js:609:12
      1  100.0%        LazyCompile: ~toString buffer.js:798:46
      1  100.0%          LazyCompile: ~readFileSync fs.js:390:22
      1  100.0%            LazyCompile: ~Module._extensions..js internal/modules/cjs/loader.js:1094:37

      1    1.3%  t __ZN4node2fsL5LStatERKN2v820FunctionCallbackInfoINS1_5ValueEEE
      1  100.0%    T __ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE
      1  100.0%      LazyCompile: ~realpathSync fs.js:1722:22
      1  100.0%        LazyCompile: ~toRealPath internal/modules/cjs/loader.js:361:20
      1  100.0%          LazyCompile: ~Module._findPath internal/modules/cjs/loader.js:462:28
      1  100.0%            LazyCompile: ~resolveMainPath internal/modules/run_main.js:12:25

      1    1.3%  UNKNOWN
      1  100.0%    t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
      1  100.0%      LazyCompile: ~prepareMainThreadExecution internal/bootstrap/pre_execution.js:21:36
      1  100.0%        Eval: ~<anonymous> internal/main/run_main_module.js:1:1

      1    1.3%  T _mach_make_memory_entry_64

      1    1.3%  T __ZN2v88internal5Scope29AllocateScopeInfosRecursivelyINS0_7IsolateEEEvPT_NS0_11MaybeHandleINS0_9ScopeInfoEEE
      1  100.0%    t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
      1  100.0%      LazyCompile: ~Module._load internal/modules/cjs/loader.js:725:24
      1  100.0%        LazyCompile: ~executeUserEntryPoint internal/modules/run_main.js:69:31
      1  100.0%          Eval: ~<anonymous> internal/main/run_main_module.js:1:1

      1    1.3%  T __ZN2v88internal15AstValueFactory11InternalizeINS0_7IsolateEEEvPT_
      1  100.0%    t __ZN2v88internalL45Builtin_Impl_V8BreakIteratorInternalAdoptTextENS0_16BuiltinArgumentsEPNS0_7IsolateE
      1  100.0%      LazyCompile: ~Writable internal/streams/writable.js:218:18
      1  100.0%        LazyCompile: ~Duplex internal/streams/duplex.js:52:16
      1  100.0%          LazyCompile: ~Socket net.js:281:16
      1  100.0%            LazyCompile: ~WriteStream tty.js:85:21

      1    1.3%  /usr/lib/system/libsystem_c.dylib

      1    1.3%  /usr/lib/libobjc.A.dylib

      1    1.3%  /usr/lib/libc++.1.dylib

请注意,这个性能报告只是一份静态的报告,它不会根据代码的变化而实时更新。如果你对代码进行了修改,需要再次运行你的应用以生成新的性能报告。

  • 41
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小纯洁w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值