回复 7# tigerpower
十几万行这么大的量必然是用第三方更快,但平时并不是很经常碰到这种处理大量数据的情况,事实上,很多时候文本不是最终目的,即使必须处理大数据,也不是单独一个第三方能独立完成的,所以第三方是了解得越多越好,但同时对 shell 本身的功能还是要有一定理解,才能把好钢用在刀刃上。
若是判断 set 中所有变量的长度,或判断伪数组 array[0]..array[N] 的长度,兄台可以试试结果
这里举个示例,判断某变量的长度100次的测试:- @echo off & setlocal enabledelayedexpansion
-
- set "str=fjalskdjfowjeeoisfjasdlkkjfpoawiecjokawenfocjseadkfjdskjflj"
- (
- (for /l %%a in (1 1 100) do gawk "BEGIN{print length(\"!str!\")}") <nul >nul
- echo Gawk*100 Start at %time%, End at !time!
- )
-
-
- (
- (for /l %%a in (1 1 100) do call :strlen str) >nul
- echo Call*100 Start at %time%, End at !time!
- )
-
-
- (
- (for /l %%a in (1 1 100) do (
- set "$=!str!#"
- set len=&for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
- echo !len!
- )) >nul
- echo inline*100 Start at %time%, End at !time!
- )
-
- pause
-
-
- :strlen
- setlocal enabledelayedexpansion
- set "$=!%1!#"
- set len=&for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
- endlocal&If %2. neq . (set/a%2=%len%)else echo %len%
复制代码 本机结果,这种频繁调用的情况下,即使是批处理中效率很低的 call 也比调用 gawk 快,更不要说内联了:
Gawk*100 Start at 20:55:26.33, End at 20:55:26.70
Call*100 Start at 20:55:26.70, End at 20:55:26.90
inline*100 Start at 20:55:26.90, End at 20:55:26.94 |