我的磁盘遍历算法为什么没有微软的的快,我不明白速度慢在那里?

Siney 2003-03-20 06:09:37
先看我的整个遍历模块

//遍历磁盘
//Aweay 2003-2-10
#ifndef BROWSEDIR
#define BROWSEDIR
#include <vcl.h>
#include <windows.h>
#include <Classes.hpp>

#define BD_FIND_DIR 0
#define BD_FIND_FILE 1
#define BD_FIND_COMPLETE 2 //查询完毕
#define BD_FIND_ABORT 3 //查询中断

//Error define
#define BD_ERR_OK 0
#define BD_ERR_NOFILTER 1
#define BD_ERR_NOCALLBACK 2
#define BD_ERR_NOTARGET 3

//Thread
#define BD_EXIT_NORMAL 0
#define BD_EXIT_ABORT 1

typedef void __fastcall (__closure *BDCallBack)(String path,int type); //回调函数类型

class TBrowseDir : public TThread //遍历整个磁盘的类
{
protected:
void __fastcall Execute();
private:
TStringList* lstDir; //用于保存临时目录
TStringList* lstFilter; //保存多种查找目标
TStringList* lstTarg;
BDCallBack lpFunc; //当找到目标时将调用这个函数指针指向的函数
String PathString(String pn); //返回带\\结尾的文件夹名称
int SearchDir(String dir);
WIN32_FIND_DATA filedata;
String tmpFn;
int tmpType;
void __fastcall CallBack();
void OnFind(String fn, int n);
int AddSubDir(String strParent);
public:
TBrowseDir(bool CreateSuspended);
__fastcall virtual ~TBrowseDir(void);
void SetCallBack(BDCallBack lpF);
void AddFilter(String strFil);
int Find();
void AddFilte(TStringList* lstF);
void AddTarget(String dir);
};

TBrowseDir::TBrowseDir(bool CreateSuspended)
:TThread(CreateSuspended)
{
//TODO: Add your source code here
lstDir=new TStringList();
lstFilter=new TStringList();
lstTarg=new TStringList();
lpFunc=NULL;
}

__fastcall TBrowseDir::~TBrowseDir()
{
//TODO: Add your source code here
delete lstDir;
delete lstFilter;
delete lstTarg;
}
/*设置回调函数,函数的类型为BDCallBack,原形如下
typedef void __fastcall (__closure *BDCallBack)(String path,int type)
当找到文件或文件夹或查找完毕将调用这个函数。
其中:
path 根据type不同表示找到的文件或文件夹,如果type返回BD_FIND_COMPLETE,则path为空
type 可以取值
BD_FIND_FILE 找到文件
BD_FIND_DIR 找到文件夹
BD_FIND_COMPLETE 查找完毕
*/
void TBrowseDir::SetCallBack(BDCallBack lpF) //设置回调函数
{
//TODO: Add your source code here
lpFunc=lpF;
}

void TBrowseDir::AddFilter(String strFil) //添加一种查找类型,例如*.txt
{
//TODO: Add your source code here
lstFilter->Add(strFil);
}

/*
用于遍历磁盘的主函数
dir表示要遍历的磁盘目录,比如"c:\\"
调用Find函数之前需要调用AddFilter函数和SetCallBack函数
*/
int TBrowseDir::Find() //查找/遍历文件夹
{
//TODO: Add your source code here
if(lstFilter->Count<=0)
return BD_ERR_NOFILTER;
if(lpFunc==NULL)
return BD_ERR_NOCALLBACK;
if(lstTarg->Count<=0)
return BD_ERR_NOTARGET;

memset(&filedata,0,sizeof(filedata));
Resume();
return BD_ERR_OK;
}

String TBrowseDir::PathString(String pn)
{
//TODO: Add your source code here
if(pn.SubString(pn.Length(),1)=="\\")
return pn;
else
return pn+String("\\");
}

int TBrowseDir::SearchDir(String dir)
{
//TODO: Add your source code here
HANDLE re;
for(int n=0;n<lstFilter->Count;n++)
{
String findit=lstFilter->Strings[n];
re=FindFirstFile(findit.c_str(),&filedata);
if(re!=INVALID_HANDLE_VALUE)
{
if(strcmp(filedata.cFileName,"..")!=0
&& strcmp(filedata.cFileName,".")!=0) //如果时文件夹并且不是上一层文件夹和自身
{
if((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0)
lstDir->Add(dir+String(filedata.cFileName));
else //找到了文件
OnFind(dir+filedata.cFileName,BD_FIND_FILE);
}
while(FindNextFile(re,&filedata))
{
if(Terminated) //处理用户终止
return BD_EXIT_ABORT;

if(strcmp(filedata.cFileName,"..")!=0
&& strcmp(filedata.cFileName,".")!=0)
{
if((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0)
lstDir->Add(dir+String(filedata.cFileName));
else
OnFind(dir+String(filedata.cFileName),BD_FIND_FILE);
}
}
}
FindClose(re); //释放
}
return BD_EXIT_NORMAL;
}

void __fastcall TBrowseDir::Execute()
{
//---- Place thread code here ----
for(int m=0;m<lstTarg->Count;m++)
{
String strDir=PathString(lstTarg->Strings[m]);
OnFind(strDir,BD_FIND_DIR);
AddSubDir(strDir);//添加子文件夹
SetCurrentDirectory(strDir.c_str());
int re=SearchDir(strDir);
if(re==BD_EXIT_ABORT)
{
OnFind("",BD_FIND_ABORT);
return;
}
int n=lstDir->Count;
while(n>0) //如果n>0证明还有文件夹没有扫描
{
String dn=PathString(lstDir->Strings[0]);
OnFind(dn,BD_FIND_DIR);
re=AddSubDir(dn);
if(re==BD_EXIT_ABORT)
{
OnFind("",BD_FIND_ABORT);
return;
}
SetCurrentDirectory(dn.c_str()); //设置当前工作目录
lstDir->Delete(0);
re=SearchDir(dn);
if(re==BD_EXIT_ABORT)
{
OnFind("",BD_FIND_ABORT);
return;
}
n=lstDir->Count;
}
}
OnFind("",BD_FIND_COMPLETE);
}

void __fastcall TBrowseDir::CallBack() //调用回调函数
{
//TODO: Add your source code here
lpFunc(tmpFn,tmpType);
}

void TBrowseDir::OnFind(String fn, int n)
{
//TODO: Add your source code here
tmpFn=fn;
tmpType=n;
Synchronize(CallBack); //VCL多线程阻塞
}
void TBrowseDir::AddFilte(TStringList* lstF) //重载方法
{
//TODO: Add your source code here
lstFilter->AddStrings(lstF);
}

int TBrowseDir::AddSubDir(String strParent) //添加strParent下的子目录
{
//TODO: Add your source code here
TSearchRec fileinfo;
memset(&fileinfo,0,sizeof(fileinfo));
int re=FindFirst(strParent+"*.*",faDirectory,fileinfo);
if(re==0)
{
if((fileinfo.Attr & faDirectory)!=0
&& fileinfo.Name!="."
&& fileinfo.Name!="..")
lstDir->Add(strParent+fileinfo.Name);
while(FindNext(fileinfo)==0)
{
if(Terminated)
return BD_EXIT_ABORT;
if((fileinfo.Attr & faDirectory)!=0
&& fileinfo.Name!="."
&& fileinfo.Name!="..")
lstDir->Add(strParent+fileinfo.Name);
}
}
FindClose(fileinfo);
return BD_EXIT_NORMAL;
}

void TBrowseDir::AddTarget(String dir)
{
//TODO: Add your source code here
lstTarg->Add(dir);
}
#endif


用我以上的算法遍历一个10g的硬盘(及指定*.*搜索)需要用50秒,而windows自带的查找文件功能查找*.*文件只需要20秒钟的时间???

为了提高速度,我没有采用递归算法,而且尽量使用API函数,可是还是有这么大的差距。

望高手指教。。。
...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chxis 2003-03-21
  • 打赏
  • 举报
回复
同算法都有关系吧?
Siney 2003-03-21
  • 打赏
  • 举报
回复
原来如此,啊
mustang_zr 2003-03-21
  • 打赏
  • 举报
回复
同意楼上

微软自己的查询程序肯定是经过优化的
jishiping 2003-03-20
  • 打赏
  • 举报
回复
Windows NT/2000/XP,有一个叫“Indexing Service”的服务,启动它的话,搜索的速度
就会加快。因为操作系统自己管理的原故,他自己使用了缓冲。就是说,第一次查询比较
慢,但是它会将查询的结果保存在内存里,以后查询的速度就快了。当新建文件,删除文
件,移动文件时,而这些操作,系统会自动更新内存里的内容。但是自己写的程序,就没
有这些先天的优势了,速度自然比不上操作系统的搜索速度。
  • 打赏
  • 举报
回复
What's "内存查询"?
netsys2 2003-03-20
  • 打赏
  • 举报
回复
windows自带的查找文件功能带有内存查询,当然快了。
特别是第二次查询,暴快
halibut 2003-03-20
  • 打赏
  • 举报
回复
up!
内容概要:本文围绕基于CNN-BiLSTM-Attention混合神经网络模型的电力负荷预测展开研究,提出一种结合卷积神经网络(CNN)、双向长短期记忆网络(BiLSTM)与注意力机制(Attention)的深度学习框架,并通过Python代码实现高精度的短期与超短期负荷预测。该模型充分利用CNN对局部特征的提取能力,捕捉负荷数据中的周期性与趋势性模式;借助BiLSTM对时间序列前后向依赖关系的建模能力,增强对动态变化的感知;并通过Attention机制自适应地聚焦关键历史时刻,提升预测准确性。文中详细阐述了数据预处理、模型结构设计、训练流程及超参数调优方法,并在真实负荷数据集上进行了实验验证,结果表明该混合模型相比传统单一模型和其他基准模型具有更优的预测性能,尤其在应对非线性、非平稳负荷波动方面表现突出。; 适合人群:具备一定Python编程能力和机器学习基础,从事电力系统分析、能源管理、智能电网或时序预测相关工作的科研人员、工程师及高校研究生。; 使用场景及目标:①应用于电网调度、电力市场出清、需求响应管理等场景下的精细化负荷预测;②为研究人员提供一套完整的、可复现的深度学习负荷预测代码框架,推动AI技术在能源领域的落地应用;③帮助理解CNN、BiLSTM与Attention模块之间的协同机制及其在时序建模中的集成方式。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点掌握数据归一化、滑动窗口构造、模型搭建与训练技巧,并尝试在不同地区、不同季节的负荷数据上进行迁移测试,以深入理解模型泛化能力与调参策略。
内容概要:本文围绕“MATLAB具有储能的经济调度及机会约束和鲁棒优化”展开,系统研究了电力系统中融合储能技术的经济调度问题,重点探讨了机会约束规划与鲁棒优化方法在应对新能源出力不确定性、负荷波动及系统运行风险中的应用。内容涵盖风光储协同调度、多微网共享储能、电动汽车参与调度、低碳经济调度等多种典型场景,深入分析了储能的选址定容、功率协调控制、状态估计与优化调度模型。核心技术包括粒子群优化(PSO)、分布鲁棒机会约束(DRCC)、模型预测控制(MPC)、鲁棒优化、二阶锥规划(SOCP)等先进算法,并提供了基于Matlab/Simulink的完整仿真代码实现,旨在提升新型电力系统的运行灵活性、经济性与抗风险能力。; 适合人群:具备电力系统、自动化、电气工程或相关专业背景,熟悉Matlab/Simulink仿真环境与基本优化算法,从事新能源并网、微电网运行、储能系统规划、电力市场调度等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并构建含储能的电力系统经济调度优化模型;② 掌握机会约束与鲁棒优化在处理新能源不确定性问题中的建模思路与求解方法;③ 利用提供的Matlab代码进行算法复现、仿真验证与性能对比,支撑科研项目攻关;④ 为撰写高水平学术论文、学位论文或工程优化方案提供可靠的模型参考与代码支持。; 阅读建议:建议读者结合文档中具体的案例(如风电-水电联合调度、电动汽车集群调度、多微网共享储能等)和配套的Matlab代码进行动手实践,重点关注优化模型的构建逻辑、约束条件设定与求解器配置过程,同时可关注公众号“荔枝科研社”获取完整资源包、复现教程及持续的技术支持。

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧