找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9315|回复: 9

[其它源码] 【分享】交换变量的2种方法

 火.. [复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2009-5-29 17:35:48 | 显示全部楼层 |阅读模式
'【程序一】:
'标准的做法SwapStr

Sub SwapStr(sA As String, sB As String)
Dim sTmp As String
sTmp = sA
sA = sB
sB = sTmp
End Sub

'【程序二】:

'用指针的做法SwapPtr
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (Destination As Any, Source As Any, ByVal Length As Long)

Sub SwapPtr(sA As String, sB As String)
Dim lTmp As Long
CopyMemory lTmp, ByVal VarPtr(sA), 4
CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4
CopyMemory ByVal VarPtr(sB), lTmp, 4
End Sub

'你是不是以为第一个程序要快,因为它看着简单而且不用调用API(调用API需要额外的处理,VB文档明确指出大量调用API将降低程序性能)。但事实上,在VB集成环境中运行,程序二要比程序一快四分之一;而编译成本机代码或p-code,程序二基本上要比程序一快一倍。下面是两个函数在编译成本机代码后,运行不同次数所花时间的比较:

'  运行100000次,SwapStr需要170毫秒,SwapPtr需要90毫秒。
'  运行200000次,SwapStr需要340毫秒,SwapPtr需要170毫秒。
'  运行2000000次,SwapStr需要3300毫秒,SwapPtr需要1500毫秒。
'  的确,调用API是需要额外指令来处理,但是由于使用了指针技术,它没有进行临时字串的分配和拷贝,因此速度提高了不少。
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

0

主题

17

回帖

0

精华

银牌会员

积分
371
发表于 2009-5-29 20:50:39 | 显示全部楼层
谢谢,有学到东西了

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2009-9-4 12:42:51 | 显示全部楼层
<p>'可以用异或运算的。。。效率会更高</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>dim x as string,y as string</p>
<p>x="test1",y="test2"</p>
<p>&nbsp;</p>
<p>x=x Xor y</p>
<p>y=y Xor x</p>
<p>x=x Xor Y</p>
<p>&nbsp;</p>
<p>'OK!完成交换!!</p>

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2009-9-4 12:44:08 | 显示全部楼层
因为位运算的速度是所有这些运算中速度最快的!

6

主题

10

回帖

0

精华

铜牌会员

积分
98
发表于 2010-11-25 13:57:09 | 显示全部楼层
364589886 发表于 2009-9-4 12:42
'可以用异或运算的。。。效率会更高
&nbsp;
&nbsp;

vb6中出现类型不匹配错误

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-11-25 18:16:46 | 显示全部楼层
回复 huabao 的帖子

字符串貌似不行的.

用数值型变量试试看?
我就是嗷嗷叫的老马了......

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-11-25 18:35:02 | 显示全部楼层
用汇编指令XCHG。
PS:很久没用这个号了,今天无聊登录一下。
如果附件无法下载,请点击这里

0

主题

53

回帖

0

精华

铜牌会员

积分
165
发表于 2012-8-1 17:02:43 | 显示全部楼层
为什么好多帖子我看到的都是很诡异的排版呢, 貌似内容中的标记没有正确解释,到处是尖括号.

0

主题

53

回帖

0

精华

铜牌会员

积分
165
发表于 2012-8-1 17:03:55 | 显示全部楼层
交换指针适合于数组和字符串变量的交换. 普通变量还是直接用临时变量赋值最快.

21

主题

162

回帖

4

精华

论坛元老

Tokyo-Hot

积分
5945
QQ
发表于 2012-8-21 01:23:19 | 显示全部楼层
测试异或方法交换两个Long类型变量成功...
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表