【问题标题】:"nested if" versus "if and" performance using F#使用 F# 的“嵌套 if”与“if and”性能
【发布时间】:2013-04-16 12:33:50
【问题描述】:

以下代码生成slow1 = 1323 msslow2 = 1311 msfast = 897 ms。这怎么可能?

这里:Nested or not nested if-blocks? 他们提到了

任何现代编译器,我的意思是在过去 20 年中构建的任何东西,都会将它们编译成相同的代码。

let s = System.Diagnostics.Stopwatch()
let mutable a = 1
s.Start()

for i in 0 .. 1000000000 do
  if i < 0 then
    if i < 0 then
      a <- 4

printfn "fast = %d" s.ElapsedMilliseconds

s.Restart()

for i in 0 .. 1000000000 do
  if i < 0 && i < 0 then
    a <- 4

printfn "slow1 = %d" s.ElapsedMilliseconds

s.Restart()

for i in 0 .. 1000000000 do
  if i < 0 & i < 0 then
    a <- 4

printfn "slow2 = %d" s.ElapsedMilliseconds

【问题讨论】:

  • 你在发布模式下试过了吗?
  • 是的。还有任何 CPU、X86 和 X64。在调试模式下,两个版本都变得同样慢(3083 毫秒)。
  • 我必须说,同样缓慢的结果比不同的结果更“有意义”......
  • 您能否将 MSIL 添加到问题中?
  • 这可能是短路算子的原因,请为if i &lt; 1000 &amp; i &lt; 1000 then添加计时

标签: c# performance if-statement f# cil


【解决方案1】:

我从 ildasm 获得了 MSIL,我将在此处发布以供其他人详细说明(没有时间) - 现在是社区 wiki 时间:

快速(只是i 比较行,其余部分相同):

//000030:   if i < 1000 then
  IL_001f:  ldloc.0
  IL_0020:  ldc.i4     0x3e8
  IL_0025:  bge.s      IL_003b
//000031:     if i < 1000 then
  IL_0027:  ldloc.0
  IL_0028:  ldc.i4     0x3e8
  IL_002d:  bge.s      IL_0038

慢:

//000039:   if i < 1000 && i < 1000 then
  IL_0084:  ldloc.0
  IL_0085:  ldc.i4     0x3e8
  IL_008a:  bge.s      IL_0097
  IL_008c:  ldloc.0
  IL_008d:  ldc.i4     0x3e8
  IL_0092:  clt
  IL_0094:  nop
  IL_0095:  br.s       IL_0099
  IL_0097:  ldc.i4.0
  IL_0098:  nop
  IL_0099:  brfalse.s  IL_00a4

顺便说一句,相同的 C# 版本的两个版本具有相同的时间。

我在反汇编中注意到的一件事是 F# 变量是 Program.i 和 Program.a,所以我不确定 F# 中是否存在某些 C# 中不存在的对象干扰。

【讨论】:

  • nop 不应该出现在优化的版本中。
  • 这是一个发布版本的输出,优化开启(VS2012)。没有关于优化的细节,只是打开或关闭。
【解决方案2】:

来自 Don Syme 的电子邮件:

是的,我们注意到了这个话题并记录了一个问题。这并不完全是一个错误(代码执行正确),但在这里获得同等性能肯定会很好。

【讨论】:

  • 您能否告诉 Don,由于 F# 开发者\爱好者社区仍然很小,而且 F# 开发团队似乎是一群非常酷的人(在编译器开发者标准中),我们很乐意得到一些个人关注:-)
猜你喜欢
  • 2015-01-17
  • 2013-09-08
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多