哪个更快,为什么? javascript

Which one is faster and why ? javascript

所以我的简单问题是: 在这种情况下,哪个是最佳解决方案(性能和内存方面):

一个。我们将变量处理成一个新变量,并在我们需要的任何地方使用它:

    // imagine (a) is an incomming variable that
    // we can't change or else we will break something

    var a = "carrots";

    var b = a.substr(0,a.length-1);
    // and then use b everywhere 

乙。我们即时处理变量:

    // imagine (a) is an incomming variable that
    // we can't change or else we will break something

    var a = "carrots";

    // and then use "a.substr(0,a.length-1);" everywhere 

拜托,这不是关于代码如何编写的问题,而是关于哪个更快更好。

你选择哪一个,为什么?

显然第一种方法更快。由于我们正在调用一个方法并访问一个 属性,这就像比 use/access 结果字符串值慢了几个数量级。

不要误会我的意思,在绝对数字上这似乎仍然是微观优化,但在这个宇宙和关系中它是光速与火车的对比。

顺便说一句,在 ECMAscript 中存储和缓存值的概念非常常用并且是正确的(出于不同的原因,例如避免作用域链和原型查找)。

我同意 jAndy 的观点。

第一个示例会更快。您正在将变量缓存到 b 中,因此您在 a 上调​​用的函数只被调用一次。在您的第二个示例中,每次您想使用 a.substr() 时,您都需要调用该函数。

所以在第一个例子中,你将调用一次a.substr(0, a.length-1) 并缓存要使用的结果。在示例二中,它将花费 n 倍的时间,其中 n 是您调用 a.substr(0, a.length-1).

的次数

根据您的操作,可能根本没有明显的区别。但是,第一种方法在技术上更快。

此外,正如对 jAndy 的回答的评论所暗示的那样,它是更好的代码,因为您不需要重复调​​用 a.substr(0, a.length-1),因为您可以缓存它.

同意 jAndy 的观点。我只是想添加一个示例,并希望再举一个例子。

第一种方法要快得多。

每次调用 substring 时,我们都需要 运行 遍历字符串并创建一个新的 substring 对象,以便将来对其进行操作。我们必须 运行 一个方法并创建一个显然更昂贵的新子串。

这样想。您可以做某事(成本与另一个选项 x 相同)一次,或者在理论上无限时间做这件事情。您正在查看 x 与无穷大的成本。

从理论上讲,您可能会在第二个中占用更少的内存。 var b 将在 java 中保留一些内存(取决于语言),一个字符串占用 8 个字节。这将持续到程序关闭。相反,如果你每次都创建一个值,然后在它不再使用时清理它。

这有意义吗?

我们创建了 var b 并保留它直到程序关闭(不再需要)。或者我们可以创建一个变量 a.substring 但在不再需要时将其删除。从技术上讲,根据程序的工作方式,如果您在整个过程中说了 100 个,那么您的内存可能会更少。然而,使用的内存可以忽略不计,并且垃圾收集的发生频率不够高(在正常情况下),这实际上是真实的/相关的。

节省内存可以忽略不计,时间复杂度比较高。

示例 A 要好得多。如果你只做一次就可以完成,为什么在现实生活中你会多次做同样的事情?