哪个更快,为什么? 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 要好得多。如果你只做一次就可以完成,为什么在现实生活中你会多次做同样的事情?
所以我的简单问题是: 在这种情况下,哪个是最佳解决方案(性能和内存方面):
一个。我们将变量处理成一个新变量,并在我们需要的任何地方使用它:
// 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 要好得多。如果你只做一次就可以完成,为什么在现实生活中你会多次做同样的事情?