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 执行时间 的相关文章

  • 在android Eclipse juno中生成R.java的过程是什么

    我已经安装了 eclipse juno 并添加了 android sdk 的插件 安装android SDK管理器后 我创建了一个新的android项目 但是出现了问题R java file R java打不开 请给我一个解决方案 我是安卓
  • Java / Scala Future 由回调驱动

    简洁版本 我怎样才能创建一个Promise
  • Eclipse:使用自定义间距查看文档,使用文件的间距保存

    我有一个 Eclipse 的愚蠢用例 在工作中 他们使用 2 个空格作为制表符 缩进看起来确实被压扁了 我发现它妨碍了可读性 现在 我无法将 Eclipse 设置为使用 4 个空格作为选项卡 因为它将编辑我更改的任何文件 并且显然不想违反编
  • 宏:knownDirectSubclasses 被嵌套类型破坏?

    我有一个宏 它枚举密封特征的直接子类型 import scala reflect macros Context import language experimental macros object Checker def apply A U
  • 按类型进行弹簧接线比按名称接线要慢很多

    在我的项目中 我试图迁移 Foo foo Foo beanFactory getBean name into Foo foo beanFactory getBean Foo class 好处是显而易见的 类型安全 更少复杂的代码 更少无用的
  • 样式组件如何影响性能?

    使用样式组件是否比样式表更会降低 Web 应用程序的速度 如果我关心性能并且没有任何依赖于 props 的样式 我是否应该放弃样式组件并使用样式表 当您有很多小组件时 同时使用样式化组件渲染 性能开销可能会很有意义 绝对值得测试以删除小元素
  • 使用原始类型模拟案例类

    考虑以下类型结构 trait HasId T def id T case class Entity id Long extends HasId Long 比方说 我们想在一些测试中模拟实体类 val entityMock mock Enti
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 空 while 循环有什么影响?

    我知道这可能是一个有点 愚蠢 的问题 但有时 我只想循环直到条件为假 但我不喜欢让循环保持为空 所以代替 Visible true while IsRunning Visible false 我通常prefer while IsRunnin
  • Android Eclipse 支持库:所需版本为空

    我刚刚从 Android 开发者网站下载并安装了适用于 Windows 的最新 ADT 捆绑包 接下来 我在 SDK 管理器中安装了所有软件包 包括 Android 支持库 Rev 18 最后 我通过 Eclipse 中的 帮助 gt 安装
  • 有没有办法使用 Eclipse 调试 Web 应用程序?

    我正在使用 Eclipse Java IDE 开发 Web 应用程序 我使用 Tomcat 6 作为我的 servlet 容器 可用于 Java 的工具 包括 Eclipse 似乎缺乏 Web 应用程序的调试功能 与 NET 平台的 Vis
  • 为什么在 Eclipse 中对 Egit 管理的项目禁用合并工具?

    根据Egit 用户指南 http wiki eclipse org EGit User Guide Using Merge Tool 要使用合并工具 应右键单击存在合并冲突的资源 然后选择Team gt 合并工具 但是 当我执行此操作时 合
  • Scala 如何忽略 Java 的检查异常?

    例如如果调用 JavaThread sleep这会抛出一个已检查的InterruptedException来自 Scala 源文件 然后不需要将调用包含在 Scala 中try catch Scala 如何删除将调用包围在 a 中的规则tr
  • 为什么 Android Eclipse 不断刷新外部文件夹并花费很长时间?

    我只有一部新的 Android 手机 我一直在修补一些基本的应用程序 每当我保存任何内容时 Eclipse 的 Android 插件就会刷新外部文件夹 这让我抓狂 通常我不会介意 但当需要 10 秒才能刷新时 我开始注意到 我已经搜索过 其
  • EGit(Eclipse git 插件)可以使用 SSH 密钥代替用户名和密码吗?

    我需要提交的 git 中央存储库是使用 SSH 密钥配置的 我的用户名是jmglov 但是当我执行 git 操作时 例如git clone 我使用这个配置 jmglov kitiara cat git config remote origi
  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN

随机推荐