【分享】VB6里面使用多线程提高穷举速度(VB6代码)

时间:2022-09-11 23:15:59
        VB6里面使用多线程提高穷举速度

    刚刚几个我论坛里的小同学在群里讨论已知位数密码穷举提速的方案,我也参与了一下.

我想了想,最简单的提速,就是真正的并行执行,即物理多线程,这需要至少两个CPU的硬件支持.

而我正好是双核CPU,于是就做了这个简单的例子( 代码在后面下载).

    代码没有多少,但却花了点时间调试.

    对于多线程的调试技术,我还非常生疏,而且经常遇到IDE与编译后结果不一致的情况,很是烦人.

    不过呢,终于是整好了.

    程序要解决的一个假设题是从1开始,一个一个地跑到40000000(4千万),如何提高速度.

    我的做法是,简单地将目标拆分为两部分,分别扔给两个线程去执行,这样速度当然就是一倍啦!

    实际测试结果也确实是这样,双线程约8秒,单线程约16秒.而将代码放到虚拟机里测试的结果,却是双

线程慢于单线程(18.X秒与17.X秒,虚拟机中是单核).看来,在只能执行一个物理线程的硬件系统中,这种

穷举使用多线程,在CPU进行逻辑线程调度时消耗的时间那还真的不少.

    由于手里没有支持超线程的CPU,所以没办法测试超线程功能是啥情况.不过从超线程原理来看,貌似

只是把线程的调度从软件上改成了硬件上,本质上还是只能同时执行一个物理线程,估计也差不多....有

支持超线程CPU的朋友帮忙测试一下吧:)

    扯点题外话,其实物理并行处理,我觉得并不是CPU的强项....去年在软件开发大会上看到了NVIDIA的

CUDA技术演示,那才叫牛B,由于GPU本身物理结构上的优势,它可以轻松拥有上百个物理线程并行处理的能

力....可惜NVIDIA送的那套光碟放在陈辉家里忘带走了,还有CSDN的那个包包...呃,对,那个包包已经是

莫依的了...

    不过呢......我的本本是INTEL的GMA3100.....与CUDA是无缘的了- -!

    扯远了.....还是把代码先发上来吧,不然还没等到各位看完,我脑袋上估计都堆了很多块砖了= =|||

     源代码在此下载:

     点击下载此文件

    BY 嗷嗷叫的老马

    紫水晶工作室
    http://www.m5home.com/
    2009-07-04 

105 个解决方案

#1


SF自己坐............

有超线程的XDJM们测试一下看看......

#2


引用楼主 myjian 的回复:
该帖子于2009-07-04 04:51:24被版主修改

咦,我是版主了吗?

#3


先顶下小马.....

#4


学习并接分

#5


我也来顶一下小马哥....

#6


试试,貌似我的电脑比搂主的高点,双线程约7秒,单线程越为14秒

#7


给老马捧场!

#8


Mark

#9


给小马捧场

#10


这个多线程的,我一定要弄明白,我实验室正好有一台双至强的超线程机器,上班了测试一下

突然觉得我以后要学习多线程编程了,因为我的计算量实在太大了。

#11


捧场 & 学习~~

#12


1 多核编程需要有多核并行算法
2 需要亲自动手进行调试

#13


伪多线程吧......
VB的多线程!!!哎...失望....

#14


引用 7 楼 syssz 的回复:
给老马捧场!

我也捧一下~~~~~~~~

#15


老马,当版主了还郁闷啥呢~~~~~~~~ 【分享】VB6里面使用多线程提高穷举速度(VB6代码)

#16


给老马捧场!

#17


收藏了.

#18


好东西。

#19


刚才测试了十次,平均双6.5秒单13.8秒!
我打开任务管理器的时候看了一下(选择显示“线程数”的列)
双线程执行完毕后,线程并没有关闭!

#20


老马当版主了,散分吧  【分享】VB6里面使用多线程提高穷举速度(VB6代码)

#21


引用 10 楼 samtyty 的回复:
这个多线程的,我一定要弄明白,我实验室正好有一台双至强的超线程机器,上班了测试一下

突然觉得我以后要学习多线程编程了,因为我的计算量实在太大了。

那快测试一下吧,想知道超线程与真正的物理多线程到底有多大差别:)

引用 12 楼 gwemail2003 的回复:
1 多核编程需要有多核并行算法
2 需要亲自动手进行调试

现在就是对于多线程程序的调试经验一点都没有,整得头晕呀......

多线程逻辑与单线程逻辑很多地方都有区别,还极不习惯,要好好研究一下....

引用 13 楼 qingye2008 的回复:
伪多线程吧......
VB的多线程!!!哎...失望....

什么是真多线程?我确实还不知道有"伪多线程"与"真多线程"这种东西存在,麻烦扫个盲吧...
不过,据我所知,这种线程叫 单元模型线程,又不是VB6的,是COM的标准之一,VB6支持而已,又关VB6啥事了.....我晕.

引用 19 楼 sandrer 的回复:
刚才测试了十次,平均双6.5秒单13.8秒!
我打开任务管理器的时候看了一下(选择显示“线程数”的列)
双线程执行完毕后,线程并没有关闭!

把那两个对象Set XX = Nothing后单元线程才会释放....你可以写在计算完成的判断里,就可以看见线程数减少了.

//

多谢大家捧场.

不过............我靠了,好象没有一个人比我的机器慢啊,我郁闷!!!

另外,那个"版主修改",应该是错别字,楼主修改才对吧.

#22


别用来做病毒软件啊

#23


henhao ......

#24


回帖拿分走人。

#25


顶。。。。

#26


老马对多线程很有研究啊,的多向你学习啊。

#27


线程分别绑定到了两个不同核心了吗? 
如果没绑定... 效率虽然提高了, 但不一定完全是双核心的计算结果

#28


如何绑定?

头一次听说呢.

#29


来给马儿捧场!

#30


hao

#31


引用 28 楼 myjian 的回复:
如何绑定?

头一次听说呢.

好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.

#32


学习 学习  我才接触VB不久

#33


引用 31 楼 lyserver 的回复:
引用 28 楼 myjian 的回复:
 如何绑定?

 头一次听说呢.

 好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.


把 Process 换成 Thread

#34


老马真能整BT的东西

#35


双核有前途!

#36


计算机:Intel(R) Core(TM)2 Duo CPU E6550  @ 2.33GHz 2.33 GHz
双线程:4266 ms
单线程:8344 ms

#37


5.5,12.1
有机会用在实例上试试
毕竟实践是检验真理的唯一标准

#38


引用 33 楼 pctgl 的回复:
引用 31 楼 lyserver 的回复:
引用 28 楼 myjian 的回复:
如何绑定?

头一次听说呢.

好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.


把 Process 换成 Thread

引用 31 楼 lyserver 的回复:
引用 28 楼 myjian 的回复:
如何绑定?

头一次听说呢.

好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.

收到!!

引用 36 楼 tiger_zhao 的回复:
计算机:Intel(R) Core(TM)2 Duo CPU E6550  @ 2.33GHz 2.33 GHz
双线程:4266 ms
单线程:8344 ms

引用 37 楼 zzhgb 的回复:
5.5,12.1
有机会用在实例上试试
毕竟实践是检验真理的唯一标准

我晕,真还没有一个CPU比我慢的!!

郁闷哪!

你们是台机还是本本?

如果是台机的话我还能想得通些.......

#39


计算机:Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
双线程:4016
单线程:8234
老马什么时候当版主了?恭喜恭喜

#40


5.1
10.4

台式机测试

#41


哪有啥版主啊,我看是CSDN的错别字

我都没有任何通知.

#42


Mark

#43


老马别吝啬了,赚钱多了该把老爷机换了!
否则影响生产!

还有,之前不是曾听说过你是 API 的版主吗?

#44


飘过

#45


引用 43 楼 sandrer 的回复:
老马别吝啬了,赚钱多了该把老爷机换了!
否则影响生产!

还有,之前不是曾听说过你是 API 的版主吗?

我只是"申请"而已,而且也是很久之前的事了,我都忘了.CSDN好象也忘了吧.

不过也正好,还是先别申请了.......

#46


影响生产!

#47


好东西收藏了

#48


学习,帮顶

#49


狐狸用超线程CPU测试了一下,证明超线程与多核/多CPU确实还是有差距的.

双线程与单线程的时间之比离1:2还差了一点.

#50


http://publish.it168.com/cWord/962.shtml

超线程小于双核的效率是必然的。

#1


SF自己坐............

有超线程的XDJM们测试一下看看......

#2


引用楼主 myjian 的回复:
该帖子于2009-07-04 04:51:24被版主修改

咦,我是版主了吗?

#3


先顶下小马.....

#4


学习并接分

#5


我也来顶一下小马哥....

#6


试试,貌似我的电脑比搂主的高点,双线程约7秒,单线程越为14秒

#7


给老马捧场!

#8


Mark

#9


给小马捧场

#10


这个多线程的,我一定要弄明白,我实验室正好有一台双至强的超线程机器,上班了测试一下

突然觉得我以后要学习多线程编程了,因为我的计算量实在太大了。

#11


捧场 & 学习~~

#12


1 多核编程需要有多核并行算法
2 需要亲自动手进行调试

#13


伪多线程吧......
VB的多线程!!!哎...失望....

#14


引用 7 楼 syssz 的回复:
给老马捧场!

我也捧一下~~~~~~~~

#15


老马,当版主了还郁闷啥呢~~~~~~~~ 【分享】VB6里面使用多线程提高穷举速度(VB6代码)

#16


给老马捧场!

#17


收藏了.

#18


好东西。

#19


刚才测试了十次,平均双6.5秒单13.8秒!
我打开任务管理器的时候看了一下(选择显示“线程数”的列)
双线程执行完毕后,线程并没有关闭!

#20


老马当版主了,散分吧  【分享】VB6里面使用多线程提高穷举速度(VB6代码)

#21


引用 10 楼 samtyty 的回复:
这个多线程的,我一定要弄明白,我实验室正好有一台双至强的超线程机器,上班了测试一下

突然觉得我以后要学习多线程编程了,因为我的计算量实在太大了。

那快测试一下吧,想知道超线程与真正的物理多线程到底有多大差别:)

引用 12 楼 gwemail2003 的回复:
1 多核编程需要有多核并行算法
2 需要亲自动手进行调试

现在就是对于多线程程序的调试经验一点都没有,整得头晕呀......

多线程逻辑与单线程逻辑很多地方都有区别,还极不习惯,要好好研究一下....

引用 13 楼 qingye2008 的回复:
伪多线程吧......
VB的多线程!!!哎...失望....

什么是真多线程?我确实还不知道有"伪多线程"与"真多线程"这种东西存在,麻烦扫个盲吧...
不过,据我所知,这种线程叫 单元模型线程,又不是VB6的,是COM的标准之一,VB6支持而已,又关VB6啥事了.....我晕.

引用 19 楼 sandrer 的回复:
刚才测试了十次,平均双6.5秒单13.8秒!
我打开任务管理器的时候看了一下(选择显示“线程数”的列)
双线程执行完毕后,线程并没有关闭!

把那两个对象Set XX = Nothing后单元线程才会释放....你可以写在计算完成的判断里,就可以看见线程数减少了.

//

多谢大家捧场.

不过............我靠了,好象没有一个人比我的机器慢啊,我郁闷!!!

另外,那个"版主修改",应该是错别字,楼主修改才对吧.

#22


别用来做病毒软件啊

#23


henhao ......

#24


回帖拿分走人。

#25


顶。。。。

#26


老马对多线程很有研究啊,的多向你学习啊。

#27


线程分别绑定到了两个不同核心了吗? 
如果没绑定... 效率虽然提高了, 但不一定完全是双核心的计算结果

#28


如何绑定?

头一次听说呢.

#29


来给马儿捧场!

#30


hao

#31


引用 28 楼 myjian 的回复:
如何绑定?

头一次听说呢.

好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.

#32


学习 学习  我才接触VB不久

#33


引用 31 楼 lyserver 的回复:
引用 28 楼 myjian 的回复:
 如何绑定?

 头一次听说呢.

 好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.


把 Process 换成 Thread

#34


老马真能整BT的东西

#35


双核有前途!

#36


计算机:Intel(R) Core(TM)2 Duo CPU E6550  @ 2.33GHz 2.33 GHz
双线程:4266 ms
单线程:8344 ms

#37


5.5,12.1
有机会用在实例上试试
毕竟实践是检验真理的唯一标准

#38


引用 33 楼 pctgl 的回复:
引用 31 楼 lyserver 的回复:
引用 28 楼 myjian 的回复:
如何绑定?

头一次听说呢.

好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.


把 Process 换成 Thread

引用 31 楼 lyserver 的回复:
引用 28 楼 myjian 的回复:
如何绑定?

头一次听说呢.

好像用Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Long函数吧.

收到!!

引用 36 楼 tiger_zhao 的回复:
计算机:Intel(R) Core(TM)2 Duo CPU E6550  @ 2.33GHz 2.33 GHz
双线程:4266 ms
单线程:8344 ms

引用 37 楼 zzhgb 的回复:
5.5,12.1
有机会用在实例上试试
毕竟实践是检验真理的唯一标准

我晕,真还没有一个CPU比我慢的!!

郁闷哪!

你们是台机还是本本?

如果是台机的话我还能想得通些.......

#39


计算机:Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
双线程:4016
单线程:8234
老马什么时候当版主了?恭喜恭喜

#40


5.1
10.4

台式机测试

#41


哪有啥版主啊,我看是CSDN的错别字

我都没有任何通知.

#42


Mark

#43


老马别吝啬了,赚钱多了该把老爷机换了!
否则影响生产!

还有,之前不是曾听说过你是 API 的版主吗?

#44


飘过

#45


引用 43 楼 sandrer 的回复:
老马别吝啬了,赚钱多了该把老爷机换了!
否则影响生产!

还有,之前不是曾听说过你是 API 的版主吗?

我只是"申请"而已,而且也是很久之前的事了,我都忘了.CSDN好象也忘了吧.

不过也正好,还是先别申请了.......

#46


影响生产!

#47


好东西收藏了

#48


学习,帮顶

#49


狐狸用超线程CPU测试了一下,证明超线程与多核/多CPU确实还是有差距的.

双线程与单线程的时间之比离1:2还差了一点.

#50


http://publish.it168.com/cWord/962.shtml

超线程小于双核的效率是必然的。