字符串替换的性能问题

ls176 2002-12-13 01:43:34
我发现字符串的replace方法在替换字符串时开销很大.

在javascript中我声明一个很长的字符串.然后要修改这个字符串中的某一部分.并且要多次修改(600次左右).这样页面所使用的时间相当长.
有没有什么办法可以提高性能?
...全文
98 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
emu 2002-12-17
  • 打赏
  • 举报
回复
呵呵,楼上教训的是,不过你到底看过了你替换后的结果是不是自己要的没呢?

既然你要用正则替换500次,那你能否告诉我你在正则的最后放的那个g是什么意思呢?

你又是否知道“/c\d+/g”这个正则在你的串中到底会做多少次替换呢?

最后,你是否知道我们前面做的测试都不用循环来实现这样的替换呢?
emu 2002-12-17
  • 打赏
  • 举报
回复
那你的意思是?
ls176 2002-12-17
  • 打赏
  • 举报
回复
我没有说microsoft在asp.net中的树用的是字符串.
emu 2002-12-17
  • 打赏
  • 举报
回复
你指的是哪个页面?microsoft怎么会用串运算来做动态树?用xml对象才是人家的拿手好戏啊。现在csdn用的xml数好像都是来自ms的。
ls176 2002-12-17
  • 打赏
  • 举报
回复
实际上每做一次替换,就是新增一个节点,这个节点的字符串信息估计在600个字符左右.
当节点数比较少时(10几个左右)速度比价快,到了后面速度越来越慢.各位可以想想在10几万的字符中去找到我要替换的字符的位置,并且这个过程还要执行很多遍.可是我在ASP.NET中看到树的显示很快.真不知microsoft是怎么做的.
walkingpoison 2002-12-16
  • 打赏
  • 举报
回复
emu(ston):我这里是试验速度,当然不需要保留运算结果了。
而且人家说了要替换500次,那么我当然用正则来替换500次了。
emu 2002-12-14
  • 打赏
  • 举报
回复
建议延迟加载。这么多个节点的树,连同画树用的图片,表现层次关系的div或者table,对浏览器是个不小的负担。
ls176 2002-12-14
  • 打赏
  • 举报
回复
我觉得各位的字符串长度还少了点.
各位可以想一下,一个包含500个节点左右的树,怎样在1-2秒的时间内显示出来?
我是将树结构写在htc中,数据来源分成数组和xml两种.可是我现在显示150个数据也要6秒左右(pIII550 256M).
emu 2002-12-14
  • 打赏
  • 举报
回复
拜托,正则是这么写的吗:
/c0/g,/c1/g,/c2/g,/c3/g,/c4/g

应该用一个正则(像这样:/c\d+/g)的地方你用了整整500个正则,还每个都globe匹配,教它怎么不慢呢?而且replace返回的是新串,你根本没有接收它,下次又拿着老串去replace了,运算完了你也不用检查一下结果对不对的?
walkingpoison 2002-12-14
  • 打赏
  • 举报
回复
再次试验,增加对数组的正则表达式替换,并增加循环次数。这次的结果则是数组的正则表达式替换是最快的:

<script>
var s="abc";
var rep=1000;
var str;
var sa=new Array();
var re=new Array();
for (var i=0;i<rep;i++){
sa[i]=s + i;
re[i]=eval("/c" + i + "/g");
}
str=sa.join("");
var d=new Date();
for (i=0;i<rep;i++){
str.replace("c" + i, "");
}
var a=new Date()-d;

d=new Date();
for (i=0;i<rep;i++){
str.replace(re[i], "");
}
var b=new Date()-d;

d=new Date();
for (i=0;i<rep;i++){
sa[i].replace("c" + i, "");
}
var c=new Date()-d;

d=new Date();
for (i=0;i<rep;i++){
sa[i].replace(re[i], "");
}
var d=new Date()-d;

alert("String replace elapsed:\t" + a + "ms\nRegExp replace elapsed:\t" + b + "ms\nString Array replace elapsed:\t" +c + "ms\nRE Array replace elapsed:\t" +d +"ms");
</script>
walkingpoison 2002-12-14
  • 打赏
  • 举报
回复
string的replace方法第一个参数可以使用字符串表达式,也可以使用正则表达式。实际比较情况如下:

<script>
var s="abc";
var str;
var sa=new Array();
var re=new Array();
for (var i=0;i<500;i++){
sa[i]=s + i;
re[i]=eval("/c" + i + "/g");
}
str=sa.join("");
var d=new Date();
for (i=0;i<500;i++){
str.replace("c" + i, "");
}
var a=new Date()-d;

d=new Date();
for (i=0;i<500;i++){
str.replace(re[i], "");
}
var b=new Date()-d;

d=new Date();
for (i=0;i<500;i++){
sa[i].replace("c" + i, "");
}
var c=new Date()-d;
alert("String replace elapsed:\t" + a + "ms\nRegExp replace elapsed:\t" + b + "ms\nString Array replace elapsed:\t" +c + "ms");
</script>

我的运行结果是:字符串的replace比正则表达式的replace略快一点(我不清楚为什么),但是使用数组来进行replace是最快的
ls176 2002-12-13
  • 打赏
  • 举报
回复
up一下
ls176 2002-12-13
  • 打赏
  • 举报
回复
我使用replace的方法
var replaceStr=new RegExp("要匹配的字符","g");
g_TreeContent=g_TreeContent.replace(replaceStr,"替换字符");
emu 2002-12-13
  • 打赏
  • 举报
回复
正则的replace最快:

<SCRIPT LANGUAGE="JavaScript">
<!--
var st0="abcdefghijklmnopqrstuvwxyz";
var ar=[];
for (var i=0;i<30000;i++){
ar[i]=st0;
}

var st=ar.join("");
var td=new Date();
st=st.replace(/ab/g,"+*");
alert(new Date()-td)

var st=ar.join("");
var td=new Date();
st=st.split("ab").join("+*")
alert(new Date()-td)

//-->
</SCRIPT>
ls176 2002-12-13
  • 打赏
  • 举报
回复
to meizz(梅花雨):
我做树型列表的htc时发现的这个问题,刚开始时用creatELement发现150多个节点显示要1,2分钟.后来将所有的createElement改成了字符串的连接中间用到了replace方法.150多个节点显示要10秒左右.现在把replace方法去掉后,改用另外一种方式,就只用3秒左右.
可是随着时间用的越来越少,程序的可读性则越来越差.

现在的这种方式我还是使用了与节点数相同的replace方法,我的目的是不想使用replace方法.
chenzengxi 2002-12-13
  • 打赏
  • 举报
回复
alert("abxas".split("a").join("b"));
meizz 2002-12-13
  • 打赏
  • 举报
回复
那么用split()方法能否快些? 我没测试过.
方法是用split()将原字符拆分成一个数组,然后将数组元素再加上指定字符循环连接起来.

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧