HarmonyOS ArkTS和TS混编是否会导致性能损耗?
根据文档描述:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-migration-background-V5
“为了保证程序的正确性,动态类型语言不得不在运行时检查对象的类型。例如,JS不允许访问undefined的属性。但是检查一个值是否为undefined的唯一的办法是在运行时进行一次类型检查。所有的JS引擎都会做如下的事:如果一个值不是undefined,那么可以访问其属性,否则抛出异常。现代JS引擎可以很好地对这类操作进行优化,但是总有一些运行时的检查是无法被消除的,这就使得程序变慢了。由于TS总是先被编译成JS,所以在TS代码中,也会面临相同的问题。ArkTS解决了这个问题。由于使能了静态类型检查,ArkTS代码将会被编译成方舟字节码文件,而不是JS代码。因此,ArkTS运行速度更快,更容易被进一步地优化。”和“TS通过打开编译选项strictNullChecks来实现此特性。但是TS是被编译成JS的,而JS没有这个特性,因此严格null检查只在编译时起作用。从程序稳定性和性能角度考虑,ArkTS将“null-safety”视为一个重要的特性。这就是为什么ArkTS强制进行严格null检查,在ArkTS中,上面的代码总是编译报错。作为交换,这样的代码可以给ArkTS引擎带来更多的信息和有关值的类型保证,这有助于更好地优化性能。”
可以理解为ArkTS通过在编译器严格的类型检查,从而避免了在方舟运行时类型检查的消耗。但对于ets和ts混编的场景,这类优化是否会生效?方舟运行时会根据源码来自ets或者ts来进行类型检查策略执行的依据从而提高性能吗?
ArkTS和TS混编可能会导致性能损耗。在ArkTS中,静态类型检查要求显式类型标注,这意味着编译器可以更好地优化代码以提高性能。如果在混编的代码中存在动态类型,编译器就无法进行同样的优化,从而可能导致性能损耗。因此,建议在开发过程中避免混用动态和静态类型的代码,以确保最佳性能。