
批處理中g(shù)oto,call和P+JS混編代碼的實測效率對比最后由 aloha0628 于 -10-27 21:17曾以為goto和call都是cmd內(nèi)部命令,效率級別相當(dāng)...曾以為P+JS混編效率應(yīng)高于純P...但實測結(jié)果,還真不一定...借用前幾天的帖子(http://www.bathome.net/thread-64179-1-1.html)簡化出一個測試題型,即對源文件(1.txt)每行文本逐列插入字符@,再輸出到新文件1.new現(xiàn)通過以下四段代碼看一下比對結(jié)果測試樣本》順便找了一個簡中編碼的文本文件,1000行(行數(shù)少不足以彰顯差別),文本行摻雜中英文字符,單行字符量≤128第一段純P代碼》用goto實現(xiàn)循環(huán),實測耗時約 29 秒第二段純P代碼》不用goto,實測耗時約 5 秒第三段混編代碼》用js逐行處理,實測耗時約 30 秒第四段混編代碼》用js一次性處理全文件,實測耗時約0.05秒(與以上各段比對可忽略不計了)用整型換算1-3段代碼實測結(jié)果》6 : 1 : 6第一段代碼
第二段代碼nclick="copycode($('code0'));">復(fù)制代碼
- @echo off &setlocal enabledelayedexpansion
- echo,%time%
- (for /f delims= %%F in (1.txt) do (
- (call :_insertCharInStr %%~F newF)
- echo,!newF!
- ))>1.new
- echo,%time%
- endlocal&exit/b
- :_insertCharInStr // %1=srcStr %2=newStr //處理1000行文本數(shù)據(jù)(單行字符量≤128)耗時約29秒
- set srcStr=%~1 &set sn= &set k=0
- :[Loop]
- for %%n in (!k!) do (set cn=!srcStr:~%%n,1!)
- if !cn!== (set %~2=!sn! &exit/b)
- set sn=!sn!@!cn! &set/a k+=1 &goto:[Loop]
第三段代碼nclick="copycode($('code1'));">復(fù)制代碼
- @echo off &setlocal enabledelayedexpansion
- echo,%time%
- (for /f delims= %%F in (1.txt) do (
- (call :insertCharInStr %%~F newF)
- echo,!newF!
- ))>1.new
- echo,%time%
- endlocal&exit/b
- :insertCharInStr // %1=srcStr %2=newStr //處理1000行文本數(shù)據(jù)耗時約5秒
- set srcStr=%~1 &(call :strLen srcStr sL) &set sn= &set/a sL-=1
- for /L %%k in (0,1,!sL!) do (set sn=!sn!@!srcStr:~%%k,1!)
- set %~2=!sn! &exit/b
- :strLen // %1=被測字符串變量名 %2=返回值變量名
- (set str=a!%~1!
- set len=0
- for /l %%a in (12,-1,0) do (
- set/a len|=1<<%%a
- for %%b in (!len!) do if !str:~%%b,1!== set/a len&=~1<<%%a
- )
- )
- if %~2 neq set/a %~2=!len!
- exit /b
第四段代碼nclick="copycode($('code2'));">復(fù)制代碼
- @set @v=1
- var v=WSH.Arguments; //獲取命令行參數(shù)
- WSH.Echo(v(0).replace(/(.)/g,'@$1')); //在字符串中逐列插入字符
nclick="copycode($('code3'));">復(fù)制代碼
- @set @v=1
- var v=WSH.Arguments; //獲取命令行參數(shù)
- var fso=new ActiveXObject('scripting.filesystemobject');
- var alltext=fso.opentextfile(v(0)).readall();
- alltext=alltext.replace(/([^rn])/g,'@$1'); //在字符串中逐列(排除換行符)插入字符
- fso.opentextfile(1.new, 2, true).write(alltext);

