本帖最后由 aloha20200628 于 2024-4-13 18:28 编辑
用本帖敲打一下 call 的功过,还是要看比较实际的测试结果,先看用于测试比对的四种方法,其各自代码如下
::方法1- set "n="&for /d /r %%d in (*) do (
- dir /b/ad "%%~d\*" 2>nul | find /v "">nul || set/a "n+=1"
- )
- echo,发现 %n% 个末级目录&exit/b
复制代码 ::方法2- set "n="&for /d /r %%d in (*) do (
- dir /b/ad "%%~d\*" 2>nul | findstr ".">nul || set/a "n+=1"
- )
- echo,发现 %n% 个末级目录&exit/b
复制代码 ::方法3- set "n="&for /d /r %%d in (*) do (
- set "k=" &for /f "delims=" %%a in ('dir /b/ad "%%~d\*" 2^>nul') do set "k=1"
- if not defined k set/a "n+=1"
- )
- echo,发现 %n% 个末级目录&exit/b
复制代码 ::方法4- set "n="&for /d /r %%d in (*) do (
- set "k=" &(call :xxx "%%~d" k)
- if not defined k set/a "n+=1"
- )
- echo,发现 %n% 个末级目录&exit/b
- :xxx
- for /r "%~1" /d %%e in (*) do (set "%~2=1"&exit/b)
- exit/b
复制代码 看如下测试结果
测试主目录及其文件和子目录体量 方法1耗时/方法2耗时/方法3耗时/方法4耗时(耗时单位=秒)
c:\a1 148,814 个文件,32,751 个文件夹 255/275/783/1149
c:\a2 30,262 个文件, 3,281 个文件夹 21/24/26/14
c:\a3 28,159 个文件, 2,114 个文件夹 13/15/15/6
c:\a4 16,916 个文件, 1,213 个文件夹 8/9/8/2
c:\a5 1,248 个文件, 717 个文件夹 4/5/4/1
从以上结果数据可见,小体量样本测试证明方法4有明显优势,但大样本比对就出现了逆转。
至少两点结论》
其一是用方法3即纯P跟读目录列表的效率会随样本体量增大锐减(此点其实是老生常谈不足为奇);
其二是“call乃效率大杀器”的杀气要在足够大体量的数据样本中才会凸显,在a1和a2体量之间存在一个令call从“英雄变狗熊”的拐点...
|