Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在TypeScript中,哪种对象实例创建方式最快?_Javascript_Typescript - Fatal编程技术网

Javascript 在TypeScript中,哪种对象实例创建方式最快?

Javascript 在TypeScript中,哪种对象实例创建方式最快?,javascript,typescript,Javascript,Typescript,我有以下3种创建对象实例的不同方法 我想知道其中哪一个更快,占用更少的内存,为什么 //Option 1 export interface Animal1 { name: string; color: string; isHungry: boolean; } let animal: Animal1 = { name: 'cat', color: 'brown', isHungry: true }; //Option 2 ex

我有以下3种创建对象实例的不同方法

我想知道其中哪一个更快,占用更少的内存,为什么

//Option 1        
export interface Animal1 {
    name: string;
    color: string;
    isHungry: boolean;
}
let animal: Animal1 = {
    name: 'cat',
    color: 'brown',
    isHungry: true
};

//Option 2   
export class Animal2 {
    name: string;
    color: string;
    isHungry: boolean;
}
let animal2: Animal2 = new Animal2();
animal2.name = 'cat';
animal2.color = 'brown';
animal2.isHungry = true;
     
//Option 3   
export class Animal3 {
    constructor(public name:string, public color:string, public isHungry:boolean) {}
}
let animal3 = new Animal3('cat', 'brown', true);
至于编码风格和维护,我更喜欢在单元测试中使用builder类的选项1。选项3最不受欢迎,因为它:

  • 很难轻松创建对象,必须设置所有属性
  • 很难维护,每次添加新属性时,都需要更新每个实例创建
  • 当具有相同类型的属性数量较多时,容易出错,例如字符串、字符串、字符串。您可能设置了错误的属性
这三者之间的性能/内存有什么不同吗?

一般来说,不可能说哪一个是“最快的”。 对象实例创建在JavaScript引擎中得到了高度优化。速度将受到周围代码、运行频率、运行时版本和许多其他因素的影响

很抱歉,这不是你想要的答案

就内存而言,您可以简单地计算每种方法创建的对象,但除非您编写的是高度优化的JavaScript(不太可能),否则这将是毫无意义的

通常,您对对象创建模式的选择不应取决于性能,而应取决于非功能性需求,如团队同意的代码样式、可维护性和API形状


当然,用TS或JS编写的算法仍然可以用通常的方法分析时间和空间复杂度。

与JavaScript中相同。对象创建时间可能差别不大,但对使用这些类型的代码的总体性能有显著影响。这些选择是不平等的

原因是“隐藏类”JIT优化和JIT可以用单态代码做的事情。如果对象成员总是以相同的顺序初始化,JIT可以将相同的“隐藏类”分配给所有类型实例,然后使用此信息使用内存偏移量而不是昂贵的哈希表查找来访问类成员。当您迭代具有相同隐藏类的对象集合(或使用具有相同隐藏类的参数重复调用函数)时,JIT可以识别单态代码并编译函数的专用版本,同时省略过多的类型检查,动态内联方法调用,并做一些其他的魔术,使现代JSVM如此之快

因此,一般来说,单态代码比多态代码快,JIT使用属性初始化顺序来确定“内部对象类型”

启用这些优化的最简单和最安全的方法是使用该类,并确保所有类成员在其构造函数中始终以相同的顺序初始化,这是示例中的选项3。选项2是最坏的,因为不能保证“隐藏类”对于不同的类实例是相同的,JIT不会认为它们具有相同的类型。 最后但并非最不重要。JS JIT的性能没有什么明显的变化。不仅JIT引擎使用稍有不同(但非常复杂)的优化策略,而且它们在一段时间内不断发展,这使得大多数关于JIT内部结构的文章在相当短的时间内过时。然而,“隐藏类”或类似的优化允许JIT利用单态代码,这是JS JIT性能的基础


无论如何,不要猜测性能,也不要相信别人说的看似显而易见的话。测量它。

我没有关于性能问题的答案,但是选项3可以使用:
构造函数(public name:string,public color:string,public isHungry:boolean){}
更简洁地编写。第一种方法应该是最快的,因为它不调用函数调用。请记住,TypeScript被转换为JavaScript,并且
new
实际上调用了一个函数,其中函数上下文
this
被设置为一个新的空对象。@MattMcCutchen true,这是更好的方法。我复制并粘贴了选项2,但忘了更改它。@MattMcCutchen我更新了它,谢谢。我同意,我正试图与我的团队一起想出一种编码风格。我们主要使用接口,但最近一位新开发人员加入了我们,他更喜欢选项3,因为这样他可以在单元测试中更快地创建新对象(尽管我们通常创建生成器类来帮助在测试中创建新对象)。所以我想知道这里是否有任何性能提升…是和否-我们有复杂的对象。在测试中,我们需要创建对象来进行测试,我认为从性能的角度考虑这一点是荒谬的。但是你为什么不为你的用例测量它呢?您将看到一秒钟内可以创建几十万个对象,然后确定性能是否真的很重要。经验测量是有效的,但由于(您不知道)发动机优化策略,很难准确地进行测量。现代发动机太复杂,无法说明选项3“在大多数情况下”是最快的.选项3是启用隐藏类的保证方法,因此,在大多数情况下,它是最快的选项是非常安全的,特别是因为“现代引擎太复杂了”。我更新了我的答案以明确这一点。感谢您的讨论。您隐藏的课堂讨论将对未来的读者有用。然而,恐怕我还是觉得你的开场白太笼统了:“在大多数情况下,选项3是最快的整体选项(如果你计算所有操作,而不仅仅是对象创建时间的话)”,这让我无法对你的答案进行投票。现在就来看看吧。