程序执行慢,想用多线程加快速度,但是加了多线程感觉跟没加一样,速度还是没有加快多少

adayume 2018-05-02 04:46:43
程序处理流程是这样的:读取文件里的数据---重新组合数据---加密数据并输出到另一个文件
因为重新组合数据花费的时间比较长,于是用主线程读取文件数据,读取完成之后丢给其它线程处理这种方法想加快文件的处理
但是现在发现
程序开始 主线程读取某一个文件的数据---其它线程重新组合数据---主线程继续读取其它文件的数据这个过程中,如果其它线程在处理数据的时候,主线程读取文件数据的速度明显变慢了,导致跟单线程的速度相比并没有加快多少
20个小时只处理了1000个文件每个文件平均大小为5M
我想问问是我的程序编写流程有问题?还是想法有问题?
先谢谢大家了
...全文
2202 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代! 在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快
worldy 2018-05-03
  • 打赏
  • 举报
回复
理论上,对于单核CPU,对于单个任务而言,单线程是效率最高最快的,对于多核CPU,有几个核就开几个线程这是比较的,因为线程切换,需要大量CPU资源,会大大的降低运行效率
hhhh63 2018-05-03
  • 打赏
  • 举报
回复
主要改进加密算法。
adayume 2018-05-03
  • 打赏
  • 举报
回复
引用 7 楼 zhangli00 的回复:
[quote=引用 4 楼 u012104827 的回复:] [quote=引用 3 楼 zhangli00 的回复:] 从描述上来看,你的读取线程和组装线程是一个同步的过程,有个先后顺序,就是先读,再组装,然后再读,这样的流程和单线程没区别,正是因为组装慢,所以读取线程在等待组装结束后继续读取,所以也慢了 解决这个问题的关键,在于缓冲区。建立一个数据缓冲区,其实也就是一个具有数据结构的存储单元,在缓冲区未写满时,读取线程一直读取数据,读到数据后,写入缓冲区,同时,组装线程持续执行(写一个死循环,记得写循环出口),组装线程每个循环都去检查缓冲区,如果缓冲区有数据,就把数据拿出来组装,然后该干嘛干嘛,记得在缓冲区中删除已经取出的数据
额,我可能表达得不好,读线程只有一个,组合线程是有多个的[/quote] 有多个就多个嘛,既然多线程组装,肯定有你自己的组装规则,我的意思是读取线程不能等组装线程有返回才再次进行读取工作,多个组装线程你就多搞几个缓冲区,轮流写,或者一个缓冲区写满再写下一个,除非你的组装有什么特殊的规则,那最好说明一下[/quote] 读取线程也没有在等组装线程返回,我准备开4个组装线程的,但是发现读取数据和组装数据都太慢了,最多就只有3个组装线程有任务,还有一个组装线程一直空闲
adayume 2018-05-03
  • 打赏
  • 举报
回复
引用 7 楼 zhangli00 的回复:
[quote=引用 4 楼 u012104827 的回复:] [quote=引用 3 楼 zhangli00 的回复:] 从描述上来看,你的读取线程和组装线程是一个同步的过程,有个先后顺序,就是先读,再组装,然后再读,这样的流程和单线程没区别,正是因为组装慢,所以读取线程在等待组装结束后继续读取,所以也慢了 解决这个问题的关键,在于缓冲区。建立一个数据缓冲区,其实也就是一个具有数据结构的存储单元,在缓冲区未写满时,读取线程一直读取数据,读到数据后,写入缓冲区,同时,组装线程持续执行(写一个死循环,记得写循环出口),组装线程每个循环都去检查缓冲区,如果缓冲区有数据,就把数据拿出来组装,然后该干嘛干嘛,记得在缓冲区中删除已经取出的数据
额,我可能表达得不好,读线程只有一个,组合线程是有多个的[/quote] 有多个就多个嘛,既然多线程组装,肯定有你自己的组装规则,我的意思是读取线程不能等组装线程有返回才再次进行读取工作,多个组装线程你就多搞几个缓冲区,轮流写,或者一个缓冲区写满再写下一个,除非你的组装有什么特殊的规则,那最好说明一下[/quote] 其实就是把hex文件读取进来变成bin文件加密再输出,在bin文件里面需要包含hex文件的信息
csulizhang 2018-05-03
  • 打赏
  • 举报
回复
引用 4 楼 u012104827 的回复:
[quote=引用 3 楼 zhangli00 的回复:] 从描述上来看,你的读取线程和组装线程是一个同步的过程,有个先后顺序,就是先读,再组装,然后再读,这样的流程和单线程没区别,正是因为组装慢,所以读取线程在等待组装结束后继续读取,所以也慢了 解决这个问题的关键,在于缓冲区。建立一个数据缓冲区,其实也就是一个具有数据结构的存储单元,在缓冲区未写满时,读取线程一直读取数据,读到数据后,写入缓冲区,同时,组装线程持续执行(写一个死循环,记得写循环出口),组装线程每个循环都去检查缓冲区,如果缓冲区有数据,就把数据拿出来组装,然后该干嘛干嘛,记得在缓冲区中删除已经取出的数据
额,我可能表达得不好,读线程只有一个,组合线程是有多个的[/quote] 有多个就多个嘛,既然多线程组装,肯定有你自己的组装规则,我的意思是读取线程不能等组装线程有返回才再次进行读取工作,多个组装线程你就多搞几个缓冲区,轮流写,或者一个缓冲区写满再写下一个,除非你的组装有什么特殊的规则,那最好说明一下
adayume 2018-05-03
  • 打赏
  • 举报
回复
先感谢楼上各位的回复了 唔。。。我放弃了,就这样跑吧,时间还是有的,现在已经跑到1600个文件了,还剩1000个文件,就让它这样跑吧 应该是重组数据的算法太慢了,因为需要用到hex文件里面的地址,而且水平有限,暂时还想不到怎么改进 再次感谢各位的回复 结贴了
adayume 2018-05-03
  • 打赏
  • 举报
回复
引用 10 楼 hhhh63 的回复:
主要改进加密算法。
加密算法的话其实就是异或而已。。。
adayume 2018-05-02
  • 打赏
  • 举报
回复
引用 2 楼 smwhotjay 的回复:
20个小时只处理了1000个文件每个文件平均大小为5M 那么每小时处理了1000/20=50 个文件 每分钟就处理了50/60=0.83个文件 1分钟就处理5m文件 有点太慢了。。。。
的确慢,主要是读取文件的时候,组合文件数据的线程处理速度感觉也变慢了,然后就各种不对劲了
adayume 2018-05-02
  • 打赏
  • 举报
回复
引用 3 楼 zhangli00 的回复:
从描述上来看,你的读取线程和组装线程是一个同步的过程,有个先后顺序,就是先读,再组装,然后再读,这样的流程和单线程没区别,正是因为组装慢,所以读取线程在等待组装结束后继续读取,所以也慢了 解决这个问题的关键,在于缓冲区。建立一个数据缓冲区,其实也就是一个具有数据结构的存储单元,在缓冲区未写满时,读取线程一直读取数据,读到数据后,写入缓冲区,同时,组装线程持续执行(写一个死循环,记得写循环出口),组装线程每个循环都去检查缓冲区,如果缓冲区有数据,就把数据拿出来组装,然后该干嘛干嘛,记得在缓冲区中删除已经取出的数据
额,我可能表达得不好,读线程只有一个,组合线程是有多个的
汪宁宇 2018-05-02
  • 打赏
  • 举报
回复
用GetTicketCount打印调试信息,看看每个函数执行时间再进行分段优化,比如改内存映射读取、10个文件同时加密等等。。。
csulizhang 2018-05-02
  • 打赏
  • 举报
回复
从描述上来看,你的读取线程和组装线程是一个同步的过程,有个先后顺序,就是先读,再组装,然后再读,这样的流程和单线程没区别,正是因为组装慢,所以读取线程在等待组装结束后继续读取,所以也慢了 解决这个问题的关键,在于缓冲区。建立一个数据缓冲区,其实也就是一个具有数据结构的存储单元,在缓冲区未写满时,读取线程一直读取数据,读到数据后,写入缓冲区,同时,组装线程持续执行(写一个死循环,记得写循环出口),组装线程每个循环都去检查缓冲区,如果缓冲区有数据,就把数据拿出来组装,然后该干嘛干嘛,记得在缓冲区中删除已经取出的数据
smwhotjay 2018-05-02
  • 打赏
  • 举报
回复
20个小时只处理了1000个文件每个文件平均大小为5M 那么每小时处理了1000/20=50 个文件 每分钟就处理了50/60=0.83个文件 1分钟就处理5m文件 有点太慢了。。。。
mxway 2018-05-02
  • 打赏
  • 举报
回复
这个要在具体源码中去分析了。速度慢可以有很多原因造成

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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