编写高性能的Javascript代码而无需优化
当使用对大型数值数组(例如线性代数程序包,对整数或浮点数进行操作)的Javascript编写对性能敏感的代码时,总是希望JIT尽可能提供帮助。大概意味着: 我们始终希望数组是压缩的SMI(小整数)或压缩的Double,这取决于我们是在进行整数还是浮点计算。 我们始终希望将相同类型的事物传递给函数,以使它们不会被标记为“大形”或未优化。例如,我们始终希望同时调用vec.add(x, y)这两个x并y打包SMI数组,或者同时打包两个Double数组。 我们希望尽可能内联函数。 当一个人偏离这些情况时,会突然而突然地降低性能。出于各种无害的原因,可能会发生这种情况: 您可以通过看似无害的操作将压缩的SMI数组转换为压缩的Double数组,例如的等效项myArray.map(x => -x)。实际上,这是“最佳”的坏情况,因为压缩Double数组仍然非常快。 您可以将打包的数组变成通用的盒装数组,例如通过将数组映射到(意外地)返回null或的函数上undefined。这种情况很容易避免。 您可能会取消对整个函数的优化,例如vec.add()通过传递太多类型的事物并将其变为大形。如果您想进行“泛型编程”,vec.add()则可能会发生这种情况,这种情况在您对类型不十分小心的情况下使用(这样会看到很多类型),并且在想要最大程度地提高性能的情况下也可以使用(例如,它只能收到盒装双打)。 我的问题更多是一个软问题,关于如何根据上述考虑编写高性能的Javascript代码,同时又保持代码的美观和可读性。一些特定的子问题,以便您了解我的目标是: 在打包SMI阵列的世界中,例如,在编程方面有一些准则吗? 是否可以使用Javascript进行通用的高性能编程,而无需使用诸如宏系统之类的工具将其内联vec.add()到callsite中? 鉴于宏调用站点和优化问题,如何将高性能代码模块化到库中?例如,如果我愉快地A高速使用Linear Algebra程序包,然后导入B依赖的程序包A,但B使用其他类型调用该程序包,然后对其进行优化,那么突然(无需更改代码)我的代码运行速度就会变慢。 是否有任何易于使用的良好测量工具来检查Javascript引擎在内部对类型进行的操作?