Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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字符串长度是否为常量时间?_Javascript_String_Performance - Fatal编程技术网

Javascript字符串长度是否为常量时间?

Javascript字符串长度是否为常量时间?,javascript,string,performance,Javascript,String,Performance,我对JS相当陌生,并且意识到长度被认为是一个属性。但我收到了一条评论,建议不要在循环中使用str.length: for(i=0;i字符串在JavaScript中也是不可变的。不需要每次访问length属性时都计算它 我创建了一个供您在此处查看的 您会注意到速度是相同的。长度是一个实例属性,它是常数时间 它必须实现一个给定长度的字符串,该字符串表示为连续的、以零结尾的JSCHAR数组 显式存储的是这里的指示器,它是恒定时间 阅读 有关Firefox如何实现字符串的更多信息。w3w3您可以使用以下

我对JS相当陌生,并且意识到长度被认为是一个属性。但我收到了一条评论,建议不要在循环中使用str.length:


for(i=0;i字符串在JavaScript中也是不可变的。不需要每次访问
length
属性时都计算它

我创建了一个供您在此处查看的


您会注意到速度是相同的。

长度是一个实例属性,它是常数时间

它必须实现一个给定长度的字符串,该字符串表示为连续的、以零结尾的JSCHAR数组

显式存储的是这里的指示器,它是恒定时间

阅读 有关Firefox如何实现字符串的更多信息。

w3w3您可以使用以下方法:

l = arr.length;
for (i = 0; i < l; i++) {..}
l=arr.length;
对于(i=0;i
与此相反:

for (i = 0; i < arr.length; i++) {...}
(i=0;i
声称:

每次迭代循环时,错误代码都会访问数组的length属性

更好的代码访问循环外部的length属性,并使循环运行得更快


将频繁访问的值存储在局部变量中是否更好? 因为学校是邪恶的,让我引用另一个来源()

从这个信息中得到的重要教训是始终将频繁访问的值存储在局部变量中。
功能过程(数据){
如果(data.count>0){
对于(变量i=0;i
…如果此值存储在局部变量中,函数将运行得更快 然后从那里访问:

功能过程(数据){
var count=data.count;
如果(计数>0){
对于(变量i=0;i

为什么属性访问比访问实例变量慢? 发件人:

大多数JavaScript引擎使用类似字典的数据结构作为对象属性的存储—每个属性访问都需要动态查找来解析属性在内存中的位置。这种方法使得访问JavaScript中的属性通常比访问Java和Smallta等编程语言中的实例变量慢得多lk


为什么绩效基准没有显示出任何差异? 一般来说,一些(或大多数)JavaScript引擎使用优化技术来提高属性访问时间,如

另外,JavaScript字符串对象可能具有不同的性质,因为您无法向它们动态添加属性(这使得动态查找不必要..我猜)


结论
对于
string.length
使用这两个代码段中的任何一个。但是对于其他进行计算的对象类型或属性,则必须首先对代码性能进行基准测试(或者只将值存储在局部变量中)。

这个问题似乎已经得到了很好的回答,但这里还有2个可能会有所帮助

使用
string.length
可能会在for循环中导致意外行为,如果循环中的字符串被具有不同长度的内容覆盖,例如:

var k = "abcabcabc";
for(var i=0; i<k.length; i++){
  k=k.slice(0,-1);
  console.log(k);
}
var k=“abcabc”;
对于(var i=0;i
在JS中,
str.length
是否也保证了恒定时间

不,事实上,JavaScript中没有任何运行时性能或复杂性保证


但是,是的,它可以在固定时间内访问,访问时没有动态线性时间长度计算。ECMAScript规范还将描述为不可变的,并且在构造字符串时对其进行初始化。

在任何具有不可变字符串的语言中,无论是Java、JavaScript、C#还是其他语言,它都将是一个非常复杂的问题语言创建者的广告实践不为字符串提供“恒定时间”“长度”操作。

由于字符串是不可变的,其长度不能更改,因此只需将创建时字符串的长度存储在string对象内的某个字段中,并在调用“length”时返回propery/method.

据我所知,字符串在javascripts中也是不可变的,length实例属性只计算一次。我不知道是谁告诉你不要在for循环中使用str.length,但我认为这没有什么意义,因为你只是在访问一个对象属性,因此除非该属性是函数(事实并非如此)该属性未被处理,因此它应该根本不是一个问题。也许他指的是其他东西?(另外,使用len变量只是引用属性,因此我无法真正预见差异)@briosheje可能是w3schools
w3schools
告诉他的。人们需要学会忽略w3schools所做的事情says@AhmadIbrahim:很好的发现,似乎确实如此。然而,正如slebetman所说,w3school绝不是官方来源,我宁愿相信MDN或其他地方的此类信息,但w3school也有同样大的影响据我所知,yahoo answers也是如此。只是说:P.无论如何,通过在jsperfs中进行测试,在性能方面显然没有区别,所以…只是猜测:可能是因为它来自w3schools?w3schools总体上是一个糟糕的资源,这也是错误的。这不仅在现代浏览器中得到了优化(即使不是,这也不是一个真正的问题),但问题是关于字符串而不是数组。情况并非总是如此。10年前(在jsperf存在之前)的性能基准表明string.length是O(n)。因此,将长度或写循环缓存为
for(var i=0,j=str.length-1;j>=0;i++,j--)一直是一种“良好做法”..
。就我个人而言,尽管我只会使用
长度
,但现在没有了matter@slebetman:真的吗?哪些发动机计算了长度
function process(data){
    if (data.count > 0){
        for (var i=0; i < data.count; i++){
            processData(data.item[i]);
        }
    }
}
function process(data){
    var count = data.count;
    if (count > 0){
        for (var i=0; i < count; i++){

            processData(data.item[i]);
        }
    }
}
var k = "abcabcabc";
for(var i=0; i<k.length; i++){
  k=k.slice(0,-1);
  console.log(k);
}