`
jindw
  • 浏览: 508605 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

javascript 性能测试系列:正则表达式

阅读更多
JSI的实现中,有这样一种需求,将有自带命名空间的脚本元素名数组转换成没有命名空间的变量名数组.
比如 :
['YAHOO.util.XXXX,YAHOO.util.YYYY,YAHOO.event.XX'] ->['YAHOO']

以前一直是较长的一段处理代码,今天突发奇想,这个用正则表达式处理效果如何?

于是,就这种处理,分别测试了正则表达式和javascript代码的效率.

测试数据如下(regTime /codeTime):
620/4536
729/4068
719/4250
645/4152
655/4642

FF和IE结果差不多,上面是FF2的数据

总结:
经常看见很多地方对正则表达式的效率的怀疑,但是这个问题放在javascript里面,好像情况又不同了. 适当使用正则式,反而可以大大提高效率.
在javascript这类\较慢的解释型语言里面,少即快,能用原生代码就不要自己写.

测试代码:
 
  1. var data = [];  
  2. for(var i = 0;i<20;i++){  
  3.   data[i] = "NS"+i/10+'.'+i  
  4. }  
  5. document.write(  
  6.   //(data == data.sort()) +"/"+  
  7.   data +"<hr>")  
  8. var i = 0;  
  9. var regTime = 0;  
  10. var codeTime = 0;  
  11. var inc = 0;  
  12. var reg = /(\b[\$\w]+)[\$\w\.]*(,\1\b[\$\w\.]*)*/g;  
  13.   
  14. var regResult,codeResult;  
  15. while(inc++<100){  
  16.   var i=0;  
  17.   var t1 = new Date();  
  18.   while(i++<100){  
  19.     regResult = data.join(',').replace(reg,'$1').split(',');  
  20.   }  
  21.   
  22.   var t2 = new Date();  
  23.   while(i++<200){  
  24.     codeResult = [];  
  25.     var flagMap = {};  
  26.     for(var j=data.length-1;j>=0;j--){  
  27.       key = data[j];  
  28.       key = key.substr(0,key.indexOf('.'));  
  29.       if(!flagMap[key]){  
  30.         codeResult[codeResult.length] = (key);  
  31.         //codeResult.push(key);  
  32.         flagMap[key] = true;  
  33.       }  
  34.     }  
  35.   }  
  36.   var t3 = new Date();  
  37.   regTime +=(t2-t1);  
  38.   codeTime+=(t3-t2);  
  39. }  
  40. document.write(  
  41.   "regResult:"+  
  42.   regResult)  
  43. document.write(  
  44.   "<hr>codeResult:"+  
  45.   codeResult)  
  46. prompt("regTime /codeTime",regTime  +'/'+codeTime)  



注:
这段正则代码是不严谨的,当数组中有多个命名空间,且顺序打乱时,不能剔除全部重复变量.不过JSI中对这个结果尚可接受.
分享到:
评论
4 楼 jindw 2007-05-31  
hax 写道
你是说你要记录一个script文件所对应的namespace的第一段?

可以这么说吧,反正就是,记录真实变量名,而不是一个带命名空间的路径
3 楼 hax 2007-05-31  
你是说你要记录一个script文件所对应的namespace的第一段?



关于Date.format,我的第一种实现是不能用来实现Date.format的,因为它依赖于$1,$2这样的形式,然后进行反向替换。

但是第二种可以用。我以后可以写一个DateFormatter。

2 楼 jindw 2007-05-31  
hax 写道
一个,我没有明白jsi的这个需求,能否解释一下?


就是将一段带有命名空间的脚本元素名数组转换成 没有命名空间的数组.
以YUI的event.js为例:
this.addScript("event.js",['YAHOO.util.CustomEvent','YAHOO.util.Subscriber','YAHOO.util.Event']);
在注册完 对象->脚本表之后,需要设置 脚本->对象表
这时,我需要将对象数组转换成['YAHOO']

确实,复杂的正则的易用性可读性都很低,所以我也只是在某些性能要求高的地方做些优化.

hax 写道
这里有一个极佳例子,用正则实现String.format...

如果用这种方式去写个Date.format估计更受欢迎的:)
1 楼 hax 2007-05-31  
一个,我没有明白jsi的这个需求,能否解释一下?

关于正则,通常有助于提高js的性能。例子如有人利用正则实现indexOf,有人用正则实现字符串map。

使用正则的特别好处(也是在使用时应时刻记住的)是,可以将多次函数调用变为一次regexp调用。多次js函数调用的开销肯定大于单次的普通regexp调用。而且有时候函数调用的次数是不定的,而regexp可以保持基本常量的性能。

这里有一个极佳例子,用正则实现String.format,比通常的正则函数查找要快,而且格式越复杂越能体现优势,具体参见:http://johnhax.blogspot.com/2006/12/string-format-function-for-javascript.html

不过正则的问题在于兼容性,老的js引擎如jscript 5.0等对正则支持不完整。另外写正则和维护正则是一件很头大的事情。

相关推荐

    用于前台验证正则表达式文档

    - Regex101:支持多种语言的正则表达式测试平台,有详细的解释器。 通过理解和熟练掌握这些正则表达式知识点,开发者能够有效地在前端实现数据验证功能,确保用户输入的数据符合预期,从而提升应用程序的质量和...

    正则表达式综合练习

    12. **调试与测试**:使用在线工具(如Regex101、RegExr)可以帮助开发者调试和测试正则表达式,确保它们按预期工作。 总的来说,掌握正则表达式能够极大地提升你在处理字符串时的效率和灵活性。无论是简单的数据...

    正则表达式调试工具

    正则表达式调试工具是开发人员用来测试和优化这些模式的重要辅助工具。本文将详细介绍"正则表达式调试工具V3.0 绿色免费版"的特点及其在软件开发中的应用。 该调试工具界面简洁,旨在为开发者提供一个友好的环境来...

    精通正则表达式(第3版).pdf

    正则表达式是计算机编程中不可或缺的一部分,它是一种强大...不过,需要注意的是,虽然正则表达式强大,但如果没有得到正确的理解和使用,也容易造成复杂的bug或影响程序性能,因此在使用前应当谨慎并进行充分的测试。

    好用的正则表达式测试工具

    描述中的“用于测试正则表达式的正确性,很好用的工具”进一步强调了这种工具的主要功能和优势。它能够帮助用户在不实际集成到代码中时验证正则表达式的正确性,避免因错误的正则导致的程序问题。此外,“很好用”...

    正则式工具(自动生成正则表达式)

    "正则式工具(自动生成正则表达式)" 提供了一个便捷的平台,帮助用户自动化创建和测试正则表达式。这样的工具通常具有以下功能: 1. **自动生成**:用户输入示例文本或描述,工具会根据输入生成对应的正则表达式。...

    汇编编写的正则表达式判断程序

    `RegExp.exe`很可能是这个程序的可执行文件,可以直接运行以测试正则表达式。`ReadMe.txt`可能包含了使用说明、版权信息或开发者留下的注释,对于理解程序的工作原理和使用方法非常有帮助。 综上所述,这个汇编编写...

    正则表达式的ppt

    12. **最佳实践**:使用清晰的正则表达式,避免过度复杂,考虑性能影响,使用适当的方法处理匹配,如预编译模式以提高效率。 这个"正则表达式的ppt"可能包含了JavaScript和Java中正则表达式的基础知识、高级特性...

    正则表达式分析工具V2.0

    正则表达式的语法包含了一系列特殊字符和构造,如点号(.)代表任意字符,星号(*)表示前一个字符可以重复零次或多次,加号(+)表示至少一次,问号(?)表示零次或一次,以及方括号([])用于定义字符集。此外,...

    JavaScript经典正则表达式实战

    JavaScript正则表达式是编程语言JavaScript中的一个重要组成部分,它用于处理文本字符串,进行模式匹配、查找、替换等操作。在JavaScript中,正则表达式是一种强大的工具,可以帮助开发者实现复杂的数据验证、文本...

    正则表达式生成和检验工具

    - **回溯和性能**:复杂的正则表达式可能导致大量的回溯,影响性能。优化正则表达式可以避免不必要的回溯,提高效率。 - **预编译和命名组**:在C#中,可以使用`RegexOptions.Compiled`选项预编译正则表达式以提高...

    正则表达式工具包

    4. **代码生成**:对于多种编程语言(如Java、Python、JavaScript等),工具可能会自动生成匹配正则表达式的代码片段,方便用户将其集成到项目中。 5. **文档和教程**:内置的帮助文档和教程将帮助初学者理解和学习...

    正则表达式系统教程.CHM

    - **调试工具**:如regex101、RegExr等在线工具,可实时测试和调试正则表达式。 - **性能优化**:避免过度复杂的正则表达式,考虑使用更高效的匹配方法。 通过学习“正则表达式系统教程”,你可以深入了解正则...

    正则表达式素材5

    8. **回溯**:理解正则表达式引擎如何处理回溯对于优化复杂正则表达式至关重要,避免不必要的回溯可以显著提升性能。 9. **在不同环境中的应用**:了解JavaScript、Python、Java、Perl等语言中正则表达式的异同,有...

    eclipse正则表达式插件regex util

    6. **多语言支持**:正则表达式语法通常与编程语言有关,Regex Util可能支持多种语言的正则语法,如Java、JavaScript、Python等。 版本`com.ess.regexutil_1.2.4`可能包含以下特性或改进: - 性能优化,提高处理...

    JavaScript正则表达式迷你书(1.1版)_程序逻辑_

    **JavaScript正则表达式迷你书(1.1版)** 正则表达式是JavaScript中一个强大的工具,用于处理文本字符串,进行模式匹配和查找、替换等操作。它们在编程逻辑中扮演着至关重要的角色,尤其是在处理字符串数据时,...

    正则表达式(java).rar

    - **测试与调试**:使用在线正则表达式测试工具,如Regex101,帮助调试和优化表达式。 - **使用预编译模式**:对于频繁使用的正则表达式,预编译模式能提高性能。 通过以上讲解,你应能对Java中的正则表达式有一...

Global site tag (gtag.js) - Google Analytics