xmlHTTP返回值重编码的优化

xml|编码|优化

置顶的帖子里有一个VBscript的代码用来将xmlHTTP返回值重编码,不过效率极其低下.....俺费了好大的力气,终于做了一个速度勉强让人满意的代码。不过水平所限还是不得不用了vbscript的chr函数用来将acsii转成unicode,不知道哪位大哥能想想办法?
ps:算法优化真是个费脑筋的活。

-×-×-×-×-×-×-×-×-华丽的更新分割线-×-×-×-×-×-×-×-×-

俺每句话都下了断点测试运行时间,终于把运行时间缩短了大约10倍,现在应该是一种可以实用的算法了。

我一开始用正则替换,每个字替换一遍,结果发现87020字节居然要40秒左右
现在这个代码在我电脑上只需要大约3秒,哈哈哈哈,感觉真爽

注意:对于只需要解码一次的情形本算法不是最优,但是对于需要多次解码的时候应该是最好的算法了。

<html>
<head>
<title>xml Http</title>
<script language=javascript>
//***Author: Hutia
//测试用的网址
url="http:\/\/www.blueidea.com\/";
//确认需要的VBScript函数是否存在,不存在就写一个
try{
if(typeof(rsB)=="undefined"){initVBS();};
}catch(e){initVBS();}
//**全局变量**
//glbEncode储存ascii到unicode字符的转换,这样做的好处是可以提高重复解码时的解码效率
glbEncode=new Array();
//**初始化函数**
function initVBS(){
 //初始化VBscript的两个funtion:rsB 和 vbChar
 strVBS="<script language=vbscript>\r\n";
 strVBS+="Function rsB(vIn)\r\nrsB=MidB(vIn,1)\r\nEnd Function\r\n";
 strVBS+="Function vbChar(ss)\r\nvbChar = Chr(ss)\r\nEnd Function\r\n";
 strVBS+="<\/script>";
 document.write(strVBS);
}
//用同步方式获取网页内容
function loadURL(strURL){
 if(!strURL){return(false);}
 var xmlHTTP=new ActiveXObject("MSXML2.XMLHTTP");
 xmlHTTP.open("GET",strURL,false);
 xmlHTTP.send("");
 return xmlHTTP;
}
//重编码
function reCode(b){
 var s=rsB(b);
 s=escape(s).replace(/%u/gi,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/ig,"%@$1$2");
 var uniS=s.match(/\%@(.{4})/g);
 s=s.replace(/@/g,"");
 if(uniS){
  var k;
  for(var i=0;i<uniS.length;i++){
   k=uniS[i].substring(2,6);
   if(!glbEncode[k]){
    glbEncode[k]=escape(vbChar(eval("0x"+k))).substring(1,6);
   }
  }
  tempA=s.split("%");
  for(var i=0;i<tempA.length;i++){
   if(tempA[i].length!=2){
    tempA[i]=glbEncode[tempA[i]];
   }
  }
  s=tempA.join("%");
 }
 return unescape(s);
}
function init(){
 stTime=(new Date()).getTime();
 ree=loadURL(url).responseBody;
 stTime2=(new Date()).getTime();
 s001=reCode(ree);
 stTime3=(new Date()).getTime();
 s001=reCode(ree);
 stTime4=(new Date()).getTime();
 s001=reCode(ree);
 stTime5=(new Date()).getTime();
 document.body.innerText="共计下载"+s001.length+"字节";
 stTime6=(new Date()).getTime();
 strR="下载用时"+(stTime2-stTime)+"ms\r\n";
 strR+="解码用时"+(stTime3-stTime2)+"ms\r\n";
 strR+="再次解码用时"+(stTime4-stTime3)+"ms\r\n";
 strR+="再次再次解码用时"+(stTime5-stTime4)+"ms\r\n";
 strR+="显示用时"+(stTime6-stTime5)+"ms\r\n";
 document.body.innerText+=strR;
 document.body.innerText+=s001;
}
</script>
</head>
<body >
下载中...
</body>
</html>

时间: 2024-08-03 04:04:33

xmlHTTP返回值重编码的优化的相关文章

获取confirm返回值的故事

也许很多人看了这个标题就会不屑看下去,大可以说网上多的去了这种问题的文章,的确,当我碰到这个问题的时候,我也首先在网上找了很多资料,但是没有合适的,或者说没有讲的清晰的,而后,我又问了几个牛人,以及几位同事,也都没有搞懂,后来在我老大的帮助下,最终还是解决了,所以我觉得有这个必要写出来给大家分享下~ 废话说了这么多,还是直奔主题吧~ 我的要求是这样的,页面上有个表单,表单的内容是绑定数据库的,需要动态刷新的,而后有个按钮--save,点击之后为保存到数据库--Insert_Save(),又有个按

Visual C++ 2005中的命名返回值优化

多年来,Microsoft Visual C++编译器一直在努力寻求更新的技术与优化方式,以求最大可能地提高程序的性能.此文描述了Visual C++编译器在不同情况下,是怎样消除多余的复制构造函数和析构函数的. 通常来说,当方法返回对象的一个实例时,会创建一个临时对象,并通过复制构造函数复制到目标对象中.在C++标准中,允许省略复制构造函数(哪怕会导致不同的程序行为),但这有一个副作用,就是编译器可能会把两个对象当成一个.Visual C++ 8.0(Visual C++ 2005)充分利用了

C++中按值返回和返回值优化代码

C++和C语言相比,最为人诟病的就是其性能问题,通常一条C语言经编译器解释后,可以固定转换成5-10条汇编语言,但是一条C++语言,就没有这么幸运了,可能会是3条汇编语言,也可能是300条.C++影响性能的原因很多,其中一个就是临时对象的创建和销毁.这里我简述一种减少创建临时对象的方法--返回值优化问题 很多时候,函数需要按值返回,这其中就会不可避免地涉及到临时对象的创建和销毁.假设定义如下的Complex类: class Complex { friend Complex operator +(

RVO-编译器返回值优化

RVO--Return Value Optimization 概述 返回值优化(Return Value Optimization,简称RVO)是一种编译器优化机制: 当函数需要返回一个对象的时候,如果自己创建一个临时对象用户返回,那么这个临时对象会消耗一个构造函数(Constructor)的调用.一个复制构造函数的调用(Copy Constructor)以及一个析构函数(Destructor)的调用的代价.而如果稍微做一点优化,就可以将成本降低到一个构造函数的代价,这样就省去了一次拷贝构造函数

ibm -在本地测试接口,返回值编码正常,部署到IBM aix上出现乱码 在线坐等大神回复

问题描述 在本地测试接口,返回值编码正常,部署到IBM aix上出现乱码 在线坐等大神回复 在本地测试接口,返回值编码正常,部署到IBM aix上出现乱码 在线坐等大神回复

硬编码-mediaCodec.dequeueOutputBuffer(b,0)返回值一直是-1

问题描述 mediaCodec.dequeueOutputBuffer(b,0)返回值一直是-1 我使用MediaCodec进行硬编码时候无法拿到outputBufferIndex. ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers(); int inputBufferIndex = mediaCodec.dequeu

在程序中获取window.confirm 的返回值

问题描述 我的成程序×××××××××××××............上面执行了很多的语句在这里弹出Response.write("confirm('确定要删除吗?');");我如何在后面的代码里判断这个值得返回是真还是假?有人让我用Hidden1获得值让后操作但我还是没调同希望有代码的同志发上来看看谢谢调了一下午郁闷 解决方案 解决方案二:在cs里获得confirm()的返回值你可以不用考虑了.你描述一下你的需求,我看能不能变向实现~解决方案三:Response.write(&quo

ajax返回值乱码

问题描述 我想用ajax+struts1.2实现一个选择公司名称后级联显示与公司相对应部门名称,出现的问题是返回值乱码(????)请各位大虾傍明解决哈..小弟跪求!!!!代码如果下:JSP代码:<table><tr><td>所属公司:td><td><selectid="companyName"onchange="refreshList()"><optionvalue="请选择..&qu

对象的初始化-用函数的返回值初始化一个类对象,这其中用了几次复制构造函数

问题描述 用函数的返回值初始化一个类对象,这其中用了几次复制构造函数 这是我自己写的一段代码#includeusing namespace std;class Example{int num;public:Example(int i){num=i;cout<<""This is construction with parameter.n"";}Example(){num=0;cout<<""This is construc