批量重复检查批处理代码优化:如何提升运行效率
嘿,这个问题我太熟了!频繁创建删除文件导致的延迟,本质是磁盘IO远慢于内存操作——每次写文件都要等磁盘响应,次数多了自然卡。咱们直接把查重逻辑搬到内存里,彻底摆脱频繁文件操作的拖累,效率能提升一大截!
核心优化思路
把所有已出现的条目存在内存变量里,用字符串匹配来查重,只在最后一次性写入结果文件,全程几乎不碰磁盘(除了最终输出)。
优化后的完整代码(适配你的攻击者名单场景)
@echo off SETLOCAL EnableDelayedExpansion :: 用特殊分隔符(|)初始化已处理条目存储,避免部分匹配错误(比如"Doc"和"Doctor") set "seen_entries=|" :: 遍历你的攻击者名单,内存里直接查重 for %%a in (Vigil Ela Lesion Mira Echo Caviera Valkyrie Frost Mute Smoke Castle Pulse Doc Rook Jager Bandit Tachanka Kapkan) do ( :: 检查当前条目是否已存在 echo !seen_entries! | findstr /C:"|%%a|" >nul if errorlevel 1 ( :: 不存在就加入已处理列表 set "seen_entries=!seen_entries!%%a|" :: 先把内容攒着,或者直接写入文件(这里直接写也没压力,因为只追加一次) echo %%a >> unique_attackers.txt ) ) :: 如果需要排序(可选),最后统一处理一次文件 sort unique_attackers.txt > temp_sorted.txt del unique_attackers.txt ren temp_sorted.txt unique_attackers.txt echo 去重完成! ENDLOCAL
为什么这比原代码快?
- 内存查重替代文件查重:原代码每次循环都要读写临时文件,现在直接在
seen_entries变量里做字符串匹配,速度快几个数量级 - 减少磁盘操作次数:只有最后写入结果(和可选的排序)会碰磁盘,没有频繁的创建/删除/追加操作
- 避免不必要的跳转:去掉了冗余的
goto :start,流程更线性,减少脚本内部的跳转开销
额外优化技巧(如果处理外部文本文件)
要是你是处理外部文本里的重复行,还可以把整个文件读进内存再处理,彻底告别逐行读写:
@echo off SETLOCAL EnableDelayedExpansion set "seen=|" set "result=" :: 读取输入文件的每一行 for /f "delims=" %%a in (input.txt) do ( echo !seen! | findstr /C:"|%%a|" >nul if errorlevel 1 ( set "seen=!seen!%%a|" set "result=!result!%%a\n" ) ) :: 一次性写入结果(用powershell处理换行更准确,纯批处理也可以用循环输出) powershell -Command "Write-Output '%result:\n=`n%'" > output.txt ENDLOCAL
这样改完,你会发现延迟几乎消失——毕竟内存操作和磁盘操作的速度差真的太大了!
内容的提问来源于stack exchange,提问作者Excallypurr




