对上述的两种方法进行了稍许改进,并且自己新加了一种方法,并加以比较运行效率。得出对于1000个字符的(似乎最长也只能处理长度为1000左右的字符串)长度计算,三楼方法(改进后)比二楼快约500毫秒,新方法(法三)效率与二楼相当,是在我的机子上。所以如果求的字符串数量很多的话(如成千上万个),还是用第二种方法较好!
测试字符串生成可以用如下命令 @set /p=%random%<nul >>a.txt&%0
新加了法四,batman的高见!
- @echo off&setlocal enabledelayedexpansion
- set /p "var=请输入字符串:"
- echo ========================
- echo [法一]
- set time1=%time%
- set /a time1_second=1%time1:~-5,2%-100
- set /a time1_millisec=1%time1:~-2,2%-100
- rem ----------[法一]主程序开始---------------------
- :loop
- set /a a+=1
- if not "!var:~%a%,1!" equ "" goto :loop
- echo 共有%a%个字符
- rem ----------[法一]主程序结束---------------------
- set time2=%time%
- set /a time2_second=1%time2:~-5,2%-100
- set /a time2_millisec=1%time2:~-2,2%-100
- if %time2_millisec% lss %time1_millisec% set /a time2_millisec+=100&set /a time2_second-=1
- set /a second=time2_second-time1_second
- set /a millisec=time2_millisec-time1_millisec
- echo 开始时间:%time1% 结束时间:%time2%
- echo 程序1运行时间为%second%秒%millisec%0毫秒
- echo ========================
- echo [法二]
- set time1=%time%
- set /a time1_second=1%time1:~-5,2%-100
- set /a time1_millisec=1%time1:~-2,2%-100
- rem ----------[法二]主程序开始---------------------
- for /l %%a in (0,1,10000) do if "!var:~%%a,1!" equ "" set length=%%a&goto end
- :end
- echo 共有%length%个字符
- rem ----------[法二]主程序结束---------------------
- set time2=%time%
- set /a time2_second=1%time2:~-5,2%-100
- set /a time2_millisec=1%time2:~-2,2%-100
- if %time2_millisec% lss %time1_millisec% set /a time2_millisec+=100&set /a time2_second-=1
- set /a second=time2_second-time1_second
- set /a millisec=time2_millisec-time1_millisec
- echo 开始时间:%time1% 结束时间:%time2%
- echo 程序2运行时间为%second%秒%millisec%0毫秒
- echo ========================
- echo [法三]
- set time1=%time%
- set /a time1_second=1%time1:~-5,2%-100
- set /a time1_millisec=1%time1:~-2,2%-100
- rem ----------[法三]主程序开始---------------------
- set count=0
- :loop2
- set /a num+=1
- for /f %%i in ("%num%") do if not "!var:~%%i,1!"=="" goto loop2
- echo 共有%num%个字符
- rem ----------[法三]主程序结束---------------------
- set time2=%time%
- set /a time2_second=1%time2:~-5,2%-100
- set /a time2_millisec=1%time2:~-2,2%-100
- if %time2_millisec% lss %time1_millisec% set /a time2_millisec+=100&set /a time2_second-=1
- set /a second=time2_second-time1_second
- set /a millisec=time2_millisec-time1_millisec
- echo 开始时间:%time1% 结束时间:%time2%
- echo 程序3运行时间为%second%秒%millisec%0毫秒
- echo ========================
- echo [法四] batman's idea
- set time1=%time%
- set /a time1_second=1%time1:~-5,2%-100
- set /a time1_millisec=1%time1:~-2,2%-100
- rem ----------[法四]主程序开始---------------------
- echo %var%>a.txt
- echo.>>a.txt
- for /f "tokens=1 delims=:" %%i in ('findstr /o .* a.txt') do set /a length=%%i-2&if not %%i
- equ 0 echo 共有%length%个字符&goto end
- :end
- del a.txt
- rem ----------[法四]主程序结束---------------------
- set time2=%time%
- set /a time2_second=1%time2:~-5,2%-100
- set /a time2_millisec=1%time2:~-2,2%-100
- if %time2_millisec% lss %time1_millisec% set /a time2_millisec+=100&set /a time2_second-=1
- set /a second=time2_second-time1_second
- set /a millisec=time2_millisec-time1_millisec
- echo 开始时间:%time1% 结束时间:%time2%
- echo 程序4运行时间为%second%秒%millisec%0毫秒
- pause>nul
复制代码 刚有些小问题,已修改,大家运行看看!!!
[ 本帖最后由 lhjoanna 于 2008-11-29 21:46 编辑 ] |