Scala循环中的代码效率是向上计数还是向下计数?

时间:2018-10-20 09:25:47

标签: scala performance loops numbers

很明显,如果您需要数数,请数数。如果您需要倒数,请倒数。但是,在其他条件相同的情况下,一个比另一个要快吗? 这是我的一个著名难题的Scala代码-检查数字是否可被13整除。 在第一个示例中,我反转数组并在随后的for循环中向上计数。在第二个示例中,我不理会数组,并进行递减的for循环。从表面上看,第二个示例看起来更快。不幸的是,在我运行代码的网站上,它总是超时。

 // works every time
object Thirteen {
import scala.annotation.tailrec

  @tailrec
  def thirt(n: Long): Long = {
    val getNum = (n: Int) => Array(1, 10, 9, 12, 3, 4)(n % 6)
    val ni  = n.toString.split("").reverse.map(_.toInt)
    var s: Long = 0
    for (i <- 0 to ni.length-1) {
        s += ni(i) * getNum(i)
    }
    if (s == n) s else thirt(s)
  }
}

// times out every time 
object Thirteen {
import scala.annotation.tailrec

  @tailrec
  def thirt(n: Long): Long = {
    val getNum = (n: Int) => Array(1, 10, 9, 12, 3, 4)(n % 6)
    val ni  = n.toString.split("").map(_.toInt)
    var s: Long = 0
    for (i <- ni.length-1 to 0 by -1) {
        s = s + ni(i) * getNum(i)
    }
    if (s == n) s else thirt(s)
  }
}

我问以下问题:

  1. 我不知道有明显的规则吗?
  2. 测试两个代码版本的性能的简便方法是–很难在JVM中衡量性能。
  3. 查看底层字节码是否有帮助?
  4. 是否有更好的代码解决方案 同样的问题,如果是这样,我将不胜感激。

虽然我看到了类似的问题,但找不到确切的答案。

1 个答案:

答案 0 :(得分:1)

这就是我想解决的方式。

<asp:button ID="RegisterButton" runat="server" Text="הירשם" class="RegisterStyle" onclientclick="var isValid = checkform(); return isValid;" onclick="RegisterButton_Click1" />