Performance 使用查找表或左/右位移位以获得2整数的幂更快吗?

Performance 使用查找表或左/右位移位以获得2整数的幂更快吗?,performance,x86,bit-manipulation,Performance,X86,Bit Manipulation,假设我想用第n个位集构建位掩码。我把N作为一个整数 哪个更好1位移位总是比查找表或计算快得多。位移位总是比查找表或计算快得多。你确定吗?我运行了这个VB程序,结果有点不稳定,但查找通常比位移位快,并且不比空时间高多少。这可能是因为缓存,所以很难从中概括 我从一个随机移位值得到了类似的结果,但当然随机数的生成比任何其他方法都要耗时 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Di

假设我想用第n个位集构建位掩码。我把N作为一个整数


哪个更好<代码>1位移位总是比查找表或计算快得多。

位移位总是比查找表或计算快得多。

你确定吗?我运行了这个VB程序,结果有点不稳定,但查找通常比位移位快,并且不比空时间高多少。这可能是因为缓存,所以很难从中概括

我从一个随机移位值得到了类似的结果,但当然随机数的生成比任何其他方法都要耗时

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim SW As New Stopwatch()
Dim TimeShift As Long
Dim TimeLookUp As Long
Dim Timenull As Long
Dim i As Integer
Dim j As Integer
Dim Bit As UInteger
Dim R As New Random()
Dim total As UInteger
Dim S = New System.Text.StringBuilder()

total = 0
SW.Start()
j = 0
For i = 1 To RepCount
  Bit = CUInt(1) << (j And 31)
  j += 1
  'Bit = 1 << (R.Next(31))
  total = total Or Bit
Next
SW.Stop()
TimeShift = SW.ElapsedMilliseconds

SW.Reset()
SW.Start()
For i = 1 To RepCount
  Bit = Bits(j And 31)
  j += 1
  'Bit = Bits(R.Next(31))
  total = total Or Bit
Next
SW.Stop()
TimeLookUp = SW.ElapsedMilliseconds

SW.Reset()
SW.Start()
For i = 1 To RepCount
  total = total Or (j And 31)
  j += 1
Next
SW.Stop()
Timenull = SW.ElapsedMilliseconds

If Stopwatch.IsHighResolution Then
  S.Append("High")
Else
  S.Append("Low")

End If
S.Append(" frequency clock")
S.AppendLine()
S.Append("Shift time= " & TimeShift & " ms")
S.AppendLine()
S.Append("Lookup time= " & TimeLookUp & " ms")
S.AppendLine()
S.Append("Null time=" & Timenull & " ms")
S.AppendLine()
S.Append("Total= " & total.ToString)

MsgBox(S.ToString)
End Sub
End Class
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
将SW调暗为新秒表()
变暗时间换档尽可能长
模糊的时间像长的一样
Dim Timenull尽可能长
作为整数的Dim i
作为整数的Dim j
模糊位为UInteger
Dim R作为新的随机变量()
作为单位积分的总积分
Dim S=New System.Text.StringBuilder()
总数=0
SW.Start()
j=0
对于i=1,重新计数

Bit=CUInt(1)您确定吗?我运行了这个VB程序,结果有点不稳定,但查找通常比位移位快,并且不比空时间高多少。这可能是因为缓存,所以很难从中概括

我从一个随机移位值得到了类似的结果,但当然随机数的生成比任何其他方法都要耗时

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim SW As New Stopwatch()
Dim TimeShift As Long
Dim TimeLookUp As Long
Dim Timenull As Long
Dim i As Integer
Dim j As Integer
Dim Bit As UInteger
Dim R As New Random()
Dim total As UInteger
Dim S = New System.Text.StringBuilder()

total = 0
SW.Start()
j = 0
For i = 1 To RepCount
  Bit = CUInt(1) << (j And 31)
  j += 1
  'Bit = 1 << (R.Next(31))
  total = total Or Bit
Next
SW.Stop()
TimeShift = SW.ElapsedMilliseconds

SW.Reset()
SW.Start()
For i = 1 To RepCount
  Bit = Bits(j And 31)
  j += 1
  'Bit = Bits(R.Next(31))
  total = total Or Bit
Next
SW.Stop()
TimeLookUp = SW.ElapsedMilliseconds

SW.Reset()
SW.Start()
For i = 1 To RepCount
  total = total Or (j And 31)
  j += 1
Next
SW.Stop()
Timenull = SW.ElapsedMilliseconds

If Stopwatch.IsHighResolution Then
  S.Append("High")
Else
  S.Append("Low")

End If
S.Append(" frequency clock")
S.AppendLine()
S.Append("Shift time= " & TimeShift & " ms")
S.AppendLine()
S.Append("Lookup time= " & TimeLookUp & " ms")
S.AppendLine()
S.Append("Null time=" & Timenull & " ms")
S.AppendLine()
S.Append("Total= " & total.ToString)

MsgBox(S.ToString)
End Sub
End Class
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
将SW调暗为新秒表()
变暗时间换档尽可能长
模糊的时间像长的一样
Dim Timenull尽可能长
作为整数的Dim i
作为整数的Dim j
模糊位为UInteger
Dim R作为新的随机变量()
作为单位积分的总积分
Dim S=New System.Text.StringBuilder()
总数=0
SW.Start()
j=0
对于i=1,重新计数


Bit=CUInt(1),所以它比加法还要快?令人印象深刻。@Steven Lu将位移到CPU,就像移动小数点对人类一样。难怪它这么快。@Steven你可以在位级别做加法&是的,它会更快。但是速度的提高通常不值得付出努力。开始讨论2的幂,这是没有争议的。你有任何URL证明x86的位移位性能(给定一个带移位量的变量N)和一个表查找吗?你的陈述听起来很正确,但证据是什么?所以它比加法还要快?令人印象深刻。@Steven Lu将位移到CPU,就像移动小数点对人类一样。难怪它这么快。@Steven你可以在位级别做加法&是的,它会更快。但是速度的提高通常不值得付出努力。开始讨论2的幂,这是没有争议的。你有任何URL证明x86的位移位性能(给定一个带移位量的变量N)和一个表查找吗?你的陈述听起来很正确,但证据是什么?嘿,彼得,请不要误解我之前的评论。我认为你贡献了这个想法真的很棒。首先,这确实是一个“另辟蹊径”的答案,特别是在2014年的今天。我发表评论的主要原因是VisualBasic语言与我提出的原始问题毫无关系。如果有什么问题的话,答案对我来说是不合适的。我很谦虚的认为,没有人会,也不应该,在这种情况下,他们应该关心使用LUT和位移位运算之间的性能,用VB(实用的)。好吧,我的程序中有一个错误-它不会在最后重置秒表。修复此功能可以使bitshift更快地出现。这就是我的想法。自我提醒-如果答案不是你想要的,检查程序。你最初的帖子没有指定语言。如果你想写一个快速而肮脏的程序来在窗口中显示一些东西(这就是我在做的,当我需要位移位时,遇到了这个线程),那么VB有什么问题吗?@Peter:一方面,在这一点上,我必须同意Steven Lu的观点:用.Net语言回答有关x86性能的问题是不符合逻辑的。真正高性能的代码将用本机语言(C++,C)编写,而不是“托管的”//GC语言(C#,VB,Java)。另一方面,我有一个VB程序,它不值得链接到一些更高性能的解决方案,所以看到您的比较很有趣。但是您编写测试的方式,在循环开销和增加j方面花费了太多的时间-这不是一个好的比较。。。。。。为了进行更精确的比较,您应该在每个循环中至少重复10次键指令。类似于
j=15:For i=1 To RepCount:total=(1 Steve-接受你关于语言的观点。但是你的例子有一个问题-一个优化编译器会注意到(1嘿,Peter,请不要误解我之前的评论。我认为你贡献了这个想法真是太好了。首先,这确实是一个问题“离开人迹罕至的道路"答案,特别是今天,2014年。我发表评论的主要原因是,Visual Basic语言与我提出的原始问题毫无关系。如果有任何问题的话,答案对我来说都是不合理的。我非常谦虚地认为,没有人会或应该处于这样一种情况,即他们应该关注这些问题e使用LUT和位移位运算之间的性能,使用VB(实用).嗯,我的程序中有一个错误-它不会在最后重置秒表。修复此错误会使bitshift更快地出现。这是我的想法。自我提醒-如果答案不是你想要的,请检查该程序。而且你最初的帖子没有指定语言。如果你想编写一个快速而肮脏的程序,VB有什么问题用于在窗口中显示某些内容(当我需要位移位并遇到此线程时,我正在执行此操作)?@Pet