Board logo

标题: [系统相关] [已解决]对于批处理变量的内存占用与CPU有疑问 [打印本页]

作者: away    时间: 2014-1-21 00:20     标题: [已解决]对于批处理变量的内存占用与CPU有疑问

本帖最后由 away 于 2014-1-23 22:50 编辑

两年前,我写了一个根据文件后缀名把不同类型的文件放到不同文件夹的批处理。
  1. @echo off
  2. ::设置数据库
  3. set ddc="lnk" "amr"
  4. set n1=文档:txt rtf doc pdf docx
  5. set n2=视频:flv f4v avi mp4
  6. set n3=图片:png jpg bmp gif
  7. set n4=音频:mp3 wav m4a
  8. set n5=批处理:bat
  9. set n6=压缩:7z zip
  10. set n7=程序:exe
  11. ::开始任务
  12. setlocal enabledelayedexpansion
  13. for /l %%e in (1 1 12) do if defined n%%e (
  14. for /f "tokens=1,2* delims=::" %%f in ("!n%%e!") do (
  15. for %%h in (%%g) do set .%%h=.%%f
  16. )
  17. )
  18. for %%d in (!ddc! "%~nx0") do set .%%~d=:y
  19. for %%i in ("!CD!\*") do (
  20. if not "!%%~xi!"==":y" (
  21. if not defined .%%~nxi (
  22. if not defined %%~xi set %%~xi=%%~xi文件&set %%~xi=.\整理于此\!%%~xi:~1!
  23. if not exist "!CD!\!%%~xi:~1!" md "!CD!\!%%~xi:~1!"
  24. move "%%i" "!CD!\!%%~xi:~1!"
  25. )
  26. )
  27. )
复制代码
这个批处理的原理就是:对一大堆文件后缀名设定一个后缀名。然后对文件夹里的文件进行处理。如果这个文件的后缀名已经定义,那就移动到定义文件夹,如果没有定义。设文件名的后缀名为定义,然后移到定义的文件夹。我曾经听批处理之家的大大说过“变量越多,内存占用就越大”。如果那位大大说的是真的话,这样一来,内存占用也就特别大了。现在我把这个批处理重写了一遍。
  1. @echo off
  2. set ddc="子目录文件转移2.5.bat"
  3. setlocal enabledelayedexpansion
  4. for %%d in (!ddc! "%~nx0") do set %%~d=:21685key
  5. :开始按关键词分类
  6. for /f "skip=26 tokens=1,2* delims=::" %%f in (%~nx0) do (
  7. for %%p in (%%g) do (
  8. for %%e in ("%cd%\*%%~p*") do (
  9. if not defined %%~nxe (
  10. if not exist "%cd%\%%f" md "%cd%\%%f"
  11. move "%%e" "%cd%\%%f"
  12. )
  13. )
  14. )
  15. )
  16. )
  17. :开始按后缀名分类
  18. for %%q in ("!CD!\*") do (
  19. if not defined %%~nxq (
  20. set %%~xq=%%~xq文件&set %%~xq=!%%~xq:~1!
  21. if not exist "!CD!\整理于此\!%%~xq!" md "!CD!\整理于此\!%%~xq!"
  22. move "%%q" "!CD!\整理于此\!%%~xq!"
  23. )
  24. )
  25. exit
  26. :数据库
  27. 文档:.epub .txt
  28. 整理于此\图片:.jpg .jpeg .png .gif
  29. 文档:.txt .rtf .doc .pdf .docx
  30. 视频:.flv .f4v .avi .mp4
  31. 图片:.png .jpg .bmp .gif
  32. 音频:.mp3 .wav .m4a
  33. 翻唱歌曲:翻唱
  34. 纯音乐:纯音乐 钢琴 piano 伴奏
复制代码
好了,我开始问问题了。
1,
第一个直接设定一大堆的变量,然后一个一个按变量来移动,而第二个完全不用【%XX%】变量,而是改用%%X的for的特有变量,这样一来第二个的内存占用是否比第一个少?抑或是一样?但是第二个的减少变量的原理就是一次又一次的读取批处理本身最后的那几行。这样CPU会不会比第一个高?高多少?还是一样?这两个批处理哪个更好?(资源占用方面)
2,
请告诉我为什么变量越多,内存占用就越大?

最后····关于贵论坛的分类我真的不知道应该分系统相关好还是其它好,最后还是选了系统相关,第一次在贵论坛发提问帖子,有什么错了请提示一下。

最后个人根据回答的结论结果:
1,理论上第二个的内存占用会比第一个少,CPU应该一样吧。
2,3楼已经解答了,变量就是暂时储存在内存里,所以变量越多内存越大。嗯,很简单的问题呢- -
作者: DAIC    时间: 2014-1-21 09:58

这两个批处理哪个更好?(资源占用方面)

代码执行的时候,你打开任务管理器观察一下就知道了。
作者: DAIC    时间: 2014-1-21 10:01

请告诉我为什么变量越多,内存占用就越大?

回家过年的时候:
2个人,骑摩托车就行了
4个人,至少要开一辆奥拓吧
30个人,租一辆大巴
100个人,专机
作者: DAIC    时间: 2014-1-21 10:04

我曾经听批处理之家的大大说过“变量越多,内存占用就越大”。如果那位大大说的是真的话,这样一来,内存占用也就特别大了。

就算你定义几千个变量,这点内存对于现在的电脑来说,不会显得“特别大”。
作者: DAIC    时间: 2014-1-21 10:09

建议合理的使用缩进,不要全部顶格写。
第二个代码里面有11个左圆括号,12个右圆括号,你能很快的找出哪里的括号不匹配吗?
作者: away    时间: 2014-1-21 13:11

谢谢DAIC大神的回答,不过对我不算有很大的帮助呢···
回复2楼
批处理执行速度是很快的,任务管理器里所记录的CPU也和内存占用也就高了两三秒,还没来得及看仔细就过去了;而且占用内容占用是一条线,CPU占用是百分比,我比较喜欢更具体的数字来表示。

回复3楼
额,有点明白了,可是如果对于变量替换,那么这个的内存会不会增加?像第二个批处理那样,不断通过替换变量的定义,会不会达到保证运行时保持一定量的内存这个目地?换你的比喻来说,就是虽然100个人需要专机,但可以用一部摩托车通过不断变换乘坐的对象来把这一百个人全都运到目的地呢?额····好像不太合适,那我再换一个比喻吧,像跑步接力赛那样,内存就是那个接棍棒,而跑步的人就是预定变量,一个人跑完一圈,就把接力棒传给下一个人,到最后每个人都跑完了,但接力棒还是只有一根。不知道在批处理的世界里是否是这样呢?

回复4楼
对现在的电脑来说,对现在的电脑来说固然算不了什么,但想当初我在那部旧电脑上制造出第一个批处理并运行的时候,CPU和内存占用可是都到了100%的程度····所以说现在我比较在意内存占用和CPU的说。

回复5楼
缩进是什么意思?
是指这样吗?
  1. for /l %%e in (1 1 12) do if defined n%%e (
  2.   for /f "tokens=1,2* delims=::" %%f in ("!n%%e!") do (
  3.     for %%h in (%%g) do set .%%h=.%%f
  4.   )
  5. )
复制代码

作者: wscript    时间: 2014-1-21 18:35

写了两年代码还不知道什么是缩进?“在意内存占用和CPU”又有什么意义呢?
作者: away    时间: 2014-1-22 07:48

回复 7# wscript


    对于缩进,我还真没怎么听过这个单词,可能你们都不经常说吧,我以前看一个个大神们的批处理里总是开头隔着几个空格,而且越近中间空格就越多,我就特纳闷,难道修改起来就不觉得不方便的吗······

   对于【“在意内存占用和CPU”又有什么意义呢?】这个问题,我个人认为,一个优秀的批处理应该是合理使用内存又有非常有效率的。我只是想改进一下这个批处理罢了。当年我写完第一个批处理,我觉得挺好用之余,还觉得挺浪费内存(那一大堆的数据库,虽然说不弄那么多就没那么多内存占用了,但是不弄那么多分类的时候又不方便),现在我想出来一个办法降低定义变量的数量,我只是在意:现在通过变量更改而不是增加来达到同一个目地,定义变量的数量少了,内存占用会不会也比以前少了?
作者: DAIC    时间: 2014-1-22 09:28

而且越近中间空格就越多,我就特纳闷,难道修改起来就不觉得不方便的吗······

第二个代码里面有11个左圆括号,12个右圆括号,你能很快的找出哪里的括号不匹配吗?
你是用记事本写代码的吗?换给工具吧,很多工具支持自动对齐的。
作者: away    时间: 2014-1-23 07:10

回复 9# DAIC


    嗯,是用Windows自带的笔记本编写的。听你这么说,我今天用Notepad++ 这个软件试着编写了一下,果然自带自动对齐。但是不过不知道为啥,右键批处理然后选"EDIT“,就用自带的笔记本编写了。
    好吧,不跑题了。这个问题开了也有两天了,我也谢谢两位大神的回答,但是你们的回答都没有正面地回答我这个问题:现在通过变量更改而不是增加来达到同一个目地,定义变量的数量少了,内存占用会不会也比以前少了?
    不知道是大神不知道答案所以未能解决我的问题还是没研究过这个问题抑或是其它原因呢?
作者: DAIC    时间: 2014-1-23 08:37

定义变量的数量少了,内存占用会不会也比以前少了?

是的
作者: DAIC    时间: 2014-1-23 08:38

但是不过不知道为啥,右键批处理然后选"EDIT“,就用自带的笔记本编写了。

右键菜单里面有一个 Edit with Notepad++
作者: away    时间: 2014-1-23 09:50

回复 12# DAIC


    是有这个选项,不过说真的,我想把右键那个EDIT关联到Notepad++而不是系统自带的笔记本上·····
    不过既然DAIC大神正面回答了这个问题,得知重写的批处理在内存占用方面确实比以前的少,头疼的问题就算解决了。
   (以前总为数据库的变量的多少而头疼,你应该懂的,数据库太少,不够人性化;数据库太多,占内存;虽然写着不多,可是一多起来真的怕卡死我那部老电脑啊)。
    在此,再次感谢DAIC大神的回答。
作者: DAIC    时间: 2014-1-23 10:13

我想把右键那个EDIT关联到Notepad++而不是系统自带的笔记本上·····

这个是由注册表控制的,比如我的:
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\txtfile\shell\edit]
  3. [HKEY_CLASSES_ROOT\txtfile\shell\edit\command]
  4. @="C:\\Program Files (x86)\\Notepad++\\notepad++.exe %1"
复制代码

作者: away    时间: 2014-1-24 12:43

回复 14# DAIC


    嗯,我知道是注册表控制的,可是注册表这么多东西,眼花缭乱啊,谢谢你的代码!




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2