Eclipse 中的 Scala 执行时间

2024-04-04

当我从 Eclipse 运行 Scala 程序时,出现了一些可疑的情况。我运行一个 App 对象,运行需要 7.8 秒(实际执行时间用对象中的 System.nanoTime 计时)。当我从命令行运行相同的 .class 文件时,需要 2.5 秒。

我注意到控制台窗口上方写着

<terminated> Run(1)[Scala Application] C:\Program Files\Java\jre6\bin\javaw.exe

我想知道这是否与时代有关。另外,这是我的 eclipse.ini 设置,我根据 Scala IDE 页面中的建议进行设置:

-vm
C:\Program Files\Java\jre6\bin
-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1.R36x_v20100810
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms256m
-Xmx2048m
-XX:PermSize=64m
-Xss1M
-server
-XX:+DoEscapeAnalysis
-XX:+UseConcMarkSweepGC
-XX:+UseCompressedOops

我 99% 确信几天前这段相同的代码在 Eclipse 中运行需要 0.7 秒。我尝试将代码粘贴到新项目中并从那里运行,但它不会改变运行时间。该项目使用全局 Scala 编译器设置,并且这些设置都设置为默认值。

更新:我刚刚尝试在 2.9.0.1 Scala 库中进行交换,以便它使用与命令行完全相同的版本,并且对运行时间没有影响。

我还尝试使用上面的所有 -vmargs 选项从命令行运行该文件,这没有什么区别。

有什么想法发生了什么,或者我需要检查任何设置吗?谢谢。


UPDATE 2:我自己现在已经回答了一半的问题 - 我以不同的方式运行代码;但这是问题所在:

版本1,扩展App:

object P005_V2 extends App { 
  def isDivis(x:Int, i:Int):Boolean = {
    if(i > 20) true
    else if(x % i != 0) false
    else isDivis(x, i+1)
  }
  def find(n:Int):Int = if (isDivis(n, 2)) n else find (n+2)

  val t = System.nanoTime;
  println (find (2))
  println(System.nanoTime - t)
}

在 Eclipse 中需要 0.7 秒,在命令提示符下需要 2.3 秒

版本 2,从另一个对象实例化

object P005_V2 { 
  def isDivis(x:Int, i:Int):Boolean = {
    if(i > 20) true
    else if(x % i != 0) false
    else isDivis(x, i+1)
  }
  def find(n:Int):Int = if (isDivis(n, 2)) n else find (n+2)

  val t = System.nanoTime;
  println (find (2))
  println(System.nanoTime - t)
}

object Run extends App {
  P005_V2
}

在 Eclipse 中需要 7.6 秒,在命令行中需要 2.5 秒

所以,我知道 App 的设计是为了让你可以在构造函数中做一些事情,并且它们会被优化,这与已弃用的不同Application。这里发生的事情似乎是因为我正在打电话println(find(2))从构造函数中,不扩展的版本App不会被优化并且需要更长的时间。

但问题仍然存在,为什么通过 Eclipse 和命令行执行之间存在巨大的速度差异?

事实上,两个命令行版本都运行得很慢,因为命令行中的 Java 版本需要 0.7 秒,而 Scala 版本应该同样快(正如在 Eclipse 中运行的版本 1 所演示的那样)。


经过一番实验,我已经得到了 95% 的答案,所以我自己给出:

我运行的是 Windows 7 64 位。

命令行正在使用32位JDK环境,由 JAVA_HOME 变量指定。

Eclipse 正在使用64 位 JRE环境,通过指定Window | Preferences | Java | Installed JREs以及项目的系统库。

将其中每个版本更改为使用其他版本会产生类似的运行时间。

java从命令行将使用可用的 64 位 JVM,无论 JAVA_HOME 中指定了什么,这与scala,这可能会导致 Scala/Java 比较中的混乱。

上述版本 1 和 2 之间的运行时间差异是因为,如前所述,版本 2 在对象的构造函数中运行昂贵的计算(而不是在App用于版本 1)。版本2是非常错误的,因为您不应该在构造函数中进行昂贵的计算和 I/O。如果您致电find直接从方法Run物体,然后速度异常消失。

结论:

运行时间取决于您运行的是 32 位还是 64 位 JVM,并且无论您的环境设置如何,这都是在 Eclipse 中指定的。如果使用 64 位版本,您需要特别小心,不要在构造函数中进行繁重的处理。

运行时间(秒):

                   Java                          Scala                         Scala - within constructor
                   JRE 64-bit     JDK 32-bit     JRE 64-bit     JDK 32-bit     JRE 64-bit     JDK 32-bit
Windows 7 64-bit   0.7            2.4            0.7            2.5            7.6            2.5
Windows XP 32-bit  n/a            13.4           n/a            14             n/a            13.1
(slower machine)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eclipse 中的 Scala 执行时间 的相关文章

  • 在 scala ide 上设置正确的 scala 版本

    我正在尝试在 scala IDE 上处理一个项目 但在 scala IDE 上遇到构建问题 在 sbt 上 该项目构建得很好 我使用了 eclipse sbt 插件并在 scala IDE 上导入了项目 存在构建错误 这使得 ide 几乎毫
  • 无法从资源加载图片

    So I am trying to load a image file from a resource so that when I export my application into a jar file it could be use
  • Scala 案例类忽略 Spark shell 中的导入

    我希望这个问题有一个明显的答案 我刚刚升级到 Spark v2 0 并且遇到了一个奇怪的问题火花外壳 Scala 2 11 版本 如果我输入以下最小的 Scala import java sql Timestamp case class C
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 当泛型类型与无界通配符一起使用时,不考虑类型参数绑定

    在我的项目中 我有一个这样的星座 trait F trait X A lt F def test x X X lt F x Trait X有一个类型参数 其上限为F 根据我的理解 类型X and X lt F 应该是等价的 但scalac2
  • 使用 scalapb 在 Spark Streaming 中解码 Proto Buf 消息时出错

    这是一个 Spark Streaming 应用程序 它使用编码的 Kafka 消息Proto Buf Using scalapb图书馆 我收到以下错误 请帮忙 gt com google protobuf InvalidProtocolBu
  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • 火花内存不足

    我有一个文件夹 里面有 150 G 的 txt 文件 大约 700 个文件 平均每个 200 MB 我使用 scala 来处理文件并最终计算一些汇总统计数据 我认为有两种可能的方法可以做到这一点 手动循环所有文件 对每个文件进行计算并最终合
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • Scala 的“神奇”函数列表

    在哪里可以找到 Scala 的 神奇 函数列表 例如apply unapply update etc 魔法函数是指编译器的某些语法糖使用的函数 例如 o update x y lt gt o x y 我用谷歌搜索了一些组合scala mag
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 在 Mac 上使用 Eclipse 进行 C++ 调试器

    当我最终设置我的 mac 来使用 eclipse 后 我无法调试 我尝试通过谷歌寻求帮助 但没有一个答案对我有用 所以 我需要有人帮助我在 eclipse 上安装和使用 c c 调试器 我安装了 Xcode 5 0 感谢您的帮助 Roy 您
  • 为什么在展开的 ADD 循环内重新初始化寄存器会使其运行速度更快,即使循环内有更多指令?

    我有以下代码 include

随机推荐