找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: netbenton

[原创] 探讨批处理代码效率

[复制链接]
发表于 2009-6-2 03:49:00 | 显示全部楼层

回复 14楼 的帖子

链接一时找不到了,但还记得代码,是技术组的一位成员发的,在只运行一次set的情况下,最高只能判断15位字符。

:
  1. @echo off
  2. set "var=12345678"
  3. set "str=%var%fedcba9876543210"
  4. set /a max=0x%str:~15,1%
  5. echo %var%  有 %max% 位
  6. pause
复制代码

[ 本帖最后由 随风 于 2009-6-2 18:12 编辑 ]
发表于 2009-6-2 03:59:09 | 显示全部楼层
找到了
523066680 在顶楼给出的9位的算法
http://www.bathome.net/viewthrea ... hlight=%D7%D6%B7%FB

15楼 tireless兄将其扩展到了15位
http://www.bathome.net/viewthrea ... =%A1%BE%C1%B7%CF%B0
发表于 2009-6-2 04:01:17 | 显示全部楼层

回复 16楼 的帖子

原来是“在只运行一次set的情况下”啊,呵呵,了解了。
发表于 2009-6-2 06:39:13 | 显示全部楼层

回复 15楼 的帖子

其实不用临时文件的话,效率也不是很低,而且更简洁一些。
  1. @echo off
  2. set "str=例如:Hello, bat! %%<^_^>%%""
  3. setlocal enabledelayedexpansion
  4. set str2=!str:y=-!
  5. set str2=!str2:n=-!
  6. set str2=!str2:a=-!
  7. for /f %%a in ('
  8.     set str2^|xcopy /-y %SystemRoot%\notepad.exe %SystemRoot%\explorer.exe ^| find /i /c "%SystemRoot%\explorer.exe"
  9. ') do set /a strlen=%%a-9
  10. echo;!str!&echo/&echo 上面的字符串长度为:!strlen!
  11. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 思路很有趣,但是优势似乎不大

查看全部评分

 楼主| 发表于 2009-6-2 13:15:10 | 显示全部楼层
re  13L
是的 a v v 变量字符不能有重复。但是全半角字符都可以,只要不重复任意使用。
此法在计算 子串 在 字符串 中的位置很实用。

re 19L
用到临时文件的话这样最简单(按字节计算的):
set str=任意字符串。
set /p=!str!<nul>len.temp
for %%a in (len.temp) do (echo !str! 长度为:%%~za)
del/q len.temp
发表于 2009-6-2 14:18:53 | 显示全部楼层

回复 20楼 的帖子

计算字节数方法较多。我的是计算字符个数。
发表于 2009-6-5 21:23:21 | 显示全部楼层
为了充分保证效率千万不要使用下面两个命令
call echo.....
call set a=...

万不得已要call set n=数字
一定要call set/a n=数字    //这个效率还是很高的是set/a 一半的效率
我发现call set a=... 的执行效率比call子过程还要低10倍以上!
发表于 2009-6-7 12:28:13 | 显示全部楼层
原帖由 netbenton 于 2009-6-2 01:31 发表
在批处理程序设计中,取字符长度最高效的方法@echo off&setlocal enabledelayedexpansion
set aav=abcdefghijklmnopqrstuvwxyz不够的话文字也可以abcdefghijklmnopqrstuvwxyzABCDEF ...

不用把aav倒过来,可以这样:
set str1=12345678
set var1=!aav:~,81!!str1!
set /a var1=len!o:~-81,1!

[ 本帖最后由 tireless 于 2009-6-7 12:29 编辑 ]
发表于 2009-6-7 13:54:33 | 显示全部楼层
我觉得find和findstr是最慢的,好像没都耐心试过这两个查找东东的,发现dir和for比她两还快!~当然for的目录多了它也跑不动,多几个for更是慢。

关于临时文件,有时候你为了看运行结果得用pause和>>,似乎那样代码就没效率了
发表于 2009-12-11 06:01:07 | 显示全部楼层

回复 12楼 的帖子

确实是很好的算法, 缺憾是当最大长度很大时, 也会需要很大的变量空间, len后面的标识符可用辅助代码生成无重复的序列

和 23 楼的想法一样, vva 变量是多余的, 我的改法更简明一些, 做个减法就行了
  1. @echo off&setlocal enabledelayedexpansion
  2. set aav=abcdefghijklmnopqrstuvwxyz不够的话文字也可以abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. set 最大长度=80
  4. for /l %%a in (0,1,%最大长度%) do set /a len!aav:~%%a,1!=最大长度-%%a
  5. ::前面初始定义一次,后面可以任意使用,只要两个set 就可以取得字符串长度。
  6. ::但前提是,你要知道需计算的字符串中,最长字符串的长度。
  7. ::效率可想而知了!

  8. set str1=12345678
  9. set str2=abcdefghijklmn

  10. set var1=!str1!!aav!
  11. set var2=!str2!!aav!
  12. set/a var1=len!var1:~%最大长度%,1!,var2=len!var2:~%最大长度%,1!
  13. echo !str1! 长度为:!var1!
  14. echo !str2! 长度为:!var2!
  15. pause
复制代码

[ 本帖最后由 neorobin 于 2009-12-11 06:14 编辑 ]
发表于 2009-12-11 08:36:05 | 显示全部楼层
路过,把老东西不被看好的再贴一次,不要BS我,只因为很久没说话了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=cn-dos.net
  4. set st2=Str%str%11111111111111111111111111111111111111111111111111111111111111111111111111111111
  5. set "st2=%st2:~0,83%"
  6. set n=!st2:Str%str%=-0!
  7. set /a n=80 %n:1=-1%
  8. echo,%n%
  9. pause
  10. ::个数可以是0 范围是0~80 的普通字符串。
复制代码

[ 本帖最后由 523066680 于 2009-12-11 08:37 编辑 ]

评分

参与人数 1PB +5 收起 理由
neorobin + 5 之前没仔细看,现在看明白了, 哈哈, 好另类的 ...

查看全部评分

发表于 2021-8-16 17:02:23 | 显示全部楼层
回复 26# 523066680


很好的算法,简单明了
发表于 2021-8-21 18:50:55 | 显示全部楼层
回复 1# netbenton


echo. a>>b.txt      1,30毫秒  (不知为什么这一点会多用那么多时间)
之所以这里时间会多很多,是由于加了点后,相当于创建的文件前面要多一个空格符号。如果在for命令里面,数据多了,将是很恐怖的一个事情,会每一行前面加一个空格符号。
发表于 2022-8-21 23:25:26 | 显示全部楼层
感谢分享!学习学习
发表于 2022-8-23 09:21:44 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2022-8-23 09:46 编辑

看了大佬们的代码,真是受益匪浅。
自己也提供一个思路,二分法。下面字符长度限定在1024之内,可根据具体情况自行调整。
由于水平有限,效率不在考虑范围之内:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set Var=123456789
  4. set a=512 256 128 64 32 16 8 4 2 1
  5. if defined Var (
  6.     set n=1
  7.     for %%i in (%a%) do (
  8.         if not "!Var:~%%i!"=="" (
  9.             set Var=!Var:~%%i!
  10.             set /a n+=%%i
  11.         )
  12.     )
  13.     echo,!n!
  14. ) else (
  15.     echo,Var is not defined
  16. )
  17. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:41 , Processed in 0.019814 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表