在VB.NET中,*0.25比/ 4快

Kev*_*oot -1 vb.net math optimization performance compilation

我知道之前已经回答过类似的问题,但我找不到的答案都不是针对.NET的.

VB.NET编译器是否优化了以下表达式:

x = y / 4
Run Code Online (Sandbox Code Playgroud)

通过编译:

x = y * 0.25
Run Code Online (Sandbox Code Playgroud)

在任何人说不要担心差异很小之前,我已经知道但是这将会被执行很多而选择一个而不是另一个可以在总执行时间上产生有用的差异并且比更重要的更容易做重构练习.

也许我应该为那些生活在完全自由的环境中的人们提到:我不能自由地改变为另一种语言.如果我是,我可能会在Fortran中编写此代码.

Kev*_*oot 6

正如这里建议的是一个简单的比较:

Dim y = 1234.567
Dim x As Double

Dim c = 10000000000.0
Dim ds As Date
Dim df As Date
ds = Now
For i = 1 To c
  x = y / 4
Next
df = Now
Console.WriteLine("divide   " & (df - ds).ToString)
ds = Now
For i = 1 To c
  x = y * 0.25
Next
df = Now
Console.WriteLine("multiply " & (df - ds).ToString)
Run Code Online (Sandbox Code Playgroud)

输出是:

divide   00:00:52.7452740
multiply 00:00:47.2607256
Run Code Online (Sandbox Code Playgroud)

所以鸿沟似乎比较慢约10%.但这种差异是如此之小,以至于我怀疑它是偶然的.另外两个运行给出:

divide   00:00:45.1280000
multiply 00:00:45.9540000

divide   00:00:45.9895985
multiply 00:00:46.8426838
Run Code Online (Sandbox Code Playgroud)

建议实际上进行优化或算术运算占总时间的一小部分.

在任何一种情况下,这意味着我不需要关心使用哪种.

事实上,ildasm显示IL在第一个循环中使用div而在第二个循环中使用mul.所以它毕竟不会取代.除非JIT编译器这样做.

  • 为_"+1"在任何一种情况下,这意味着我不需要关心使用哪种."_ (3认同)
  • 您可能想接受自己的答案. (2认同)