找回密码
 欢迎注册
查看: 7101|回复: 5

[分享] 判断操作与加操作

[复制链接]
发表于 2020-11-13 11:39:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
我在VBA中测试加操作和判断操作,发现一个加操作约等于两个判断操作。
    Dim ddd(1000000) As Long
    Dim aaa(1000000) As Long
    Dim ccc(1000000) As Long
    Dim i As Long
    Dim TempsUtilise As Single
   
     QueryPerformanceCounter Counter1
        For i = 0 To 1000000
        
            ccc(i) = aaa(i) + ddd(i)
        Next i
    QueryPerformanceCounter Counter2
   
    TempsUtilise = (Counter2 - Counter1) / Frequency
    MsgBox TempsUtilise
   
     QueryPerformanceCounter Counter1
        For i = 0 To 1000000
            If aaa(i) = 0 Then
'                If ddd(i) = 0 Then
'
'                End If
            End If

        Next i
    QueryPerformanceCounter Counter2
   
    TempsUtilise = (Counter2 - Counter1) / Frequency
    MsgBox TempsUtilise

Msgbox1=0.0434334
Msgbox2=0.0234633

别的语言也是这样吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2020-11-15 03:03:09 | 显示全部楼层
补一个图片

测试结果界面

测试结果界面
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-11-22 21:45:47 | 显示全部楼层
ccc(i) = aaa(i) + ddd(i)
这个操作包括
  1. 计算地址aaa[i]//大概是汇编的lea命令
  2. 读取//对应mov
  3. 计算地址ddd[i]
  4. 读取
  5. 相加
  6. 计算地址ccc[i]
  7. 储存//对应mov
复制代码


            If aaa(i) = 0 Then
'                If ddd(i) = 0 Then
'
'                End If
            End If
在其他语言里,这样的if很可能直接被编译器优化掉
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2020-11-24 10:21:33 | 显示全部楼层
不想抠那么细了。从表面看一下效率就行了。因为有时候纠结于究竟是执行两个判断呢,还是一个加法操作呢, 所以才有这个测试。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-11-24 17:49:38 来自手机 | 显示全部楼层
在数组aaa,ddd随机写入一半的1就应该会显著变慢
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-11-30 06:10:21 来自手机 | 显示全部楼层
通常来说,加法是快于判断语句的,只是楼主的测试例子不合理,看起来加法更慢
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-16 23:51 , Processed in 0.051262 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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