哪种迭代构造更适合在Scala中使用?

神秘感

最近,我开始在Scala中编写很多编程竞赛的代码。(您可以在此处查看平台-http: //codeforces.com/

关于问题的性质,我经常需要遍历数组或输入数据。例如,有一个问题说明,它说,在第一个输入行上,我将得到数字M,然后需要读取M行,或者整数或其他内容。我尝试使用不同的方法:

for (i <- 0 until M)
---- 
(0 until M).foreach
----
var i = 0
while (i < M)
---

甚至尾递归

@tailrec
  def recursion(i: Int): Unit = {
    if (i < M) {
      doSomething()
      recursion(i + 1)
    }
  }

因此,我的问题是,关于Scala风格,哪种结构更适合使用并获得更好的性能(我要解决的问题通常需要快速执行,否则将无法通过)

PS我为此编写了一个小型测试,看起来虽然while和tailrec的性能最佳,但并不是一件大事。您可以在这里查看-https://gist.github.com/MysterionRise/5daa63fdbd5d058528fe

赛格哈

关于性能:

请注意,如果您想在JVM上编写适当的微基准测试,则必须考虑许多影响-例如,当JVM开始使用JIT编译时,同一段代码的性能起初会有所不同,然后尝试不同优化。要在Scala中编写适当的基准,您可以查看例如ScalaMetercaliper之类的库顺便说一句,第二个链接比较了Scala中循环的不同方式,因此应该很容易适应您的用例。

但是,一般来说:

  • 尾部递归解决方案将被优化为与等效的while循环所生成的相同类型的字节码,因此两者应始终相似(如果代码确实等效)。
  • for循环是调用foreach方法的语法糖,因此两者应严格等效。
  • foreach(或for循环)比等效的while循环(或尾部递归)要慢一些:我上面链接基准测试显示,经过1000多次迭代后,性能差异为15倍(尽管它可能取决于Scala的版本和的版本) JRE ...)。但是,如果循环内的代码比循环本身花费更长的时间来执行,那么这种差异将可以忽略不计,这并不意味着它总是与之相关。

关于样式:

我完全同意johanandren的回答。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

哪种类型更适合获取String路径?

在python中解析HTML-lxml或BeautifulSoup?哪种目的更适合哪种用途?

聊天应用程序-哪种技术更适合在Android中实现聊天应用程序

哪种方法更适合加载JDBC驱动程序?

哪种类型的Jfreechart更适合直方图?

向量或数组列表哪个更适合使用?

android:哪种方法更适合使用CoordinatorLayout

哪种类型的缓存适合在Umbraco项目中使用,如何实现智能缓存?

哪种方法更适合发现容器就绪状态?

哪种串行器或适配器最适合在ember js中使用?

哪种类型的实现将更适合服务层?

哪种粒度更适合迁移?

哪种序列类型更适合比较,为什么?(蟒蛇)

哪种编码更适合使用Z3解决偏序理论?

与Map相比,何时更适合使用Set?

哪种散列函数更适合在小散列表中表示128位随机ID

哪种方法更适合在sql server中查找最大值?

Android:哪种方法更适合导航Listview(片段或Listactivity)

只是调查哪个平台更适合使用

哪种文件系统更适合Ceph?

哪种方法更适合跟踪远程分支?

哪种类型的演员适合在这里?

哪个文件系统更适合在外部HDD上使用?ExFAT或NTFS?

是否适合在c中使用usleep作为Timer

哪种视图布局更适合制作应用商店克隆?

哪个更适合在 PHP 中定义存储库接口?

丑陋的 IF 条件:哪种方式更适合代码可读性?

哪种更适合这种情况。zipWith 还是 .map?

为什么更新 gridview 也会更新数据源(datatable)?如果是 2 种方式,那么哪种方式更适合迭代?