[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
第一想到 VBS + BAT
纯P的效率不够撒

TOP

为什么 测试值这么高啊 比用FC搞个临时文件也高好多
  1. :::::::::::::::::::::::::::::::: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  2. @echo off
  3. set /p var=<%0
  4. setlocal EnableDelayedExpansion
  5. for /l %%i in (32 1 126) do (
  6.    if defined _"!var:~%%i,1!" (
  7.       set "#!var:~%%i,1!=!var:~%%i,1!"
  8.       set "$#!var:~%%i,1!=%%i"
  9.    ) else set _"!var:~%%i,1!"=!var:~%%i,1!&set "$!var:~%%i,1!=%%i"
  10. )
  11. set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^^_`az|}~
  12. set "Slen=!str!"
  13. for %%i in (4096 2048 1024 512 256 128 64 32 16)do if "!Slen:~%%i!" NEQ "" set/aLen+=%%i&set Slen=!Slen:~%%i!
  14. set Slen=!Slen!FEDCBA9876543210&set/aLen+=0x!Slen:~16,1!
  15. ECHO !LEN!
  16. for /l %%i in (0 1 !Len!) do (
  17.     for /f "delims=" %%j in ("!str:~%%i,1!") do (
  18.         if "%%j" == "" (set ANS=!ANS! 33)else (
  19.            if "!#%%j!" equ "" (if "!$%%j!" equ "" (set ANS=!ANS! 61)else set ANS=!ANS! !$%%j!) else (
  20.               if "!#%%j!" lss "%%j" (set ANS=!ANS! !$%%j!) else set ANS=!ANS! !$#%%j!
  21.            )
  22.         )
  23.     )
  24. )
  25. echo!ANS!
  26. pause
复制代码

TOP

本帖最后由 terse 于 2012-3-5 18:48 编辑

怪不得 测试值这么高 原来没清空Len变量 我就说 从代码流程来说不应该这么高撒 现在测试值我这里700多

另:CrLf版主的 FC 方案 省去临时文件?
1

评分人数

TOP

  1. :::::::::::::::::::::::::::::::: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  2. @echo off
  3. set /p var=<%0
  4. :: 获得100000次执行 @echo off 任务的耗时,存放在ct1变量内
  5. set t1=%time%
  6. for /l %%a in (1 1 100000)do @echo off
  7. set t2=%time%
  8. call:etime t1 t2 tc1
  9. setlocal enabledelayedexpansion
  10. for /l %%i in (32 1 126) do (
  11.    if defined _"!var:~%%i,1!" (
  12.       set "#!var:~%%i,1!=!var:~%%i,1!"
  13.       set "$#!var:~%%i,1!=%%i"
  14.    ) else set _"!var:~%%i,1!"=!var:~%%i,1!&set "$!var:~%%i,1!=%%i"
  15. )
  16. :: 获得500次执行“你的代码”任务的耗时,存放在ct2变量内
  17. set t1=%time%
  18. for /l %%a in (1 1 500)do (
  19. set str= ^^!"$%%&'()*+,-./09:;<=>?@AZ[^^_`az|}~
  20. set Len=0&set "Slen=!str!"
  21. for %%i in (4096 2048 1024 512 256 128 64 32 16)do if "!Slen:~%%i!" NEQ "" set/aLen+=%%i&set Slen=!Slen:~%%i!
  22. set Slen=!Slen!FEDCBA9876543210&set/aLen+=0x!Slen:~16,1!
  23. for /l %%i in (0 1 !Len!) do (
  24.     for /f "delims=" %%j in ("!str:~%%i,1!") do (
  25.         if "%%j" neq "" (
  26.            if "!#%%j!" neq "" (
  27.               if "!#%%j!" lss "%%j" (set Ans=!Ans! !$%%j!) else set Ans=!Ans! !$#%%j!
  28.            ) else if "!$%%j!" neq "" (set Ans=!Ans! !$%%j!)else set Ans=!Ans! 61
  29.         ) else set Ans=!Ans! 33
  30.     )
  31. )
  32. echo!Ans!&set Ans=
  33. )
  34. set t2=%time%
  35. call:etime t1 t2 tc2
  36. :: 计算执行一次“你的代码”与执行一次“@echo off”的耗时比
  37. set/a rate=200*tc2/tc1
  38. echo 一次任务与一次“@echo off命令”耗时比=%rate%
  39. pause
  40. :etime <begin> <end> <ret> //求时差
  41. setlocal enabledelayedexpansion
  42. Set/a "c=(!%2:~,2!-!%1:~,2!)*360000+(1!%2:~3,2!-1!%1:~3,2!)*6000+1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,c+=-8640000*(c>>31)"
  43. endlocal&set %3=%c%&goto:eof
  44. :: 某些标签子过程,(该处可省略)
  45. :label
  46. rem ....
复制代码
3

评分人数

    • neorobin: THANKS技术 + 1
    • CrLf: 看来我对变量索引的偏见太深了...PB + 10 技术 + 1
    • plp626: 我的xp效率比900+;最终变量法最快速技术 + 1

TOP

回复 39# plp626
测试代码取自一楼的 是如上面如此嵌入吗

TOP

回复 43# CrLf
我的意思是 假如临时文件$大于 CMD 应该出错的哦  当然此案另外

TOP

本帖最后由 terse 于 2012-3-6 18:53 编辑

回复 45# CrLf
还是不以为这样的流程 是取文件的16进制
我以为还应用等大空文件 不是吗?(当然这里不讨论这个话题了)

TOP

回复 47# neorobin
谢谢neorobin 指教了
对于 ";" 问题记得以前也讨论过处理   有时候用 FINDSTR /n 处理文件
当然设置 eol 也不失为一好的方法
唉 总是犯此类错
就此题的话 原方法不变的话 修改FOR为下面
  1.     for /f "tokens=1*" %%j in ("$ !str:~%%i,1!") do (
  2.         if "%%k" neq "" (
  3.            if "!#%%k!" neq "" (
  4.               if "!#%%k!" lss "%%k" (set Ans=!Ans! %%k-!$%%k!) else set Ans=!Ans! %%k-!$#%%k!
  5.            ) else if "!$%%k!" neq "" (set Ans=!Ans! %%k-!$%%k!)else set Ans=!Ans! %%k-61
  6.         ) else set Ans=!Ans! %%k-33
  7.     )
复制代码

TOP

返回列表