scala 是不是比 java 更快,因为两者都在 JVM 上运行? [复制]

Posted

技术标签:

【中文标题】scala 是不是比 java 更快,因为两者都在 JVM 上运行? [复制]【英文标题】:Is scala is faster that java since both runs on JVM? [duplicate]scala 是否比 java 更快,因为两者都在 JVM 上运行? [复制] 【发布时间】:2015-10-09 12:09:47 【问题描述】:

在我研究过的许多网站中,scala 比 Java 快。我已经编写了代码来测试这两者之间的时间差,但 Scala 需要更多时间。我不知道我是否犯了任何错误。如果我错了,请纠正我。

Scala 代码

package com.first

import java.util.ArrayList

object Word extends App
  val absoluteResult = new ArrayList[Any]()
  val before = System.currentTimeMillis()
  var i =0
  while (i<10000) 
    i = i+1
    val result = List("foo", 23, true).iterator
    while (result.hasNext) 
      absoluteResult.add(foo(result.next))
    
  
  println("Took : "+(System.currentTimeMillis() - before)
      +" ms, number of elements : "+absoluteResult.size)

  def foo(obj : Any) =
    obj match 
          case _:String => "String"
          case _:Boolean => "Boolean"
          case _:Integer => "Integer"
          case _ => throw new IllegalArgumentException()
    

输出 耗时:142 毫秒,元素数量:30000

Java 代码

package com.first;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class quicksort 
    public static void main(String[] args) 
        List<Object> absoluteResult = new ArrayList<Object>();
        long before = System.currentTimeMillis();
        for (int i=0; i < 10000; i++) 
          List<Object> result = new ArrayList<Object>();
          result.add("foo");
          result.add( 23);
          result.add(true);
          for (Object y : result) 
            absoluteResult.add(foo(y));
          
        
        System.out.println("Took : "+(System.currentTimeMillis() - before)
          +" ms, number of elements : "+absoluteResult.size());
      


    static String foo(Object s) 
      if (s instanceof String) 
        return "String";
       else if (s instanceof Boolean) 
        return "Boolean";
       else if (s instanceof Integer) 
        return "Integer";
       else 
        throw new IllegalArgumentException();
      


输出 耗时:30 毫秒,元素数量:30000

【问题讨论】:

我不是说哪个更快,但是对于有意义的测试,您可以尝试使用 for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM. openjdk.java.net/projects/code-tools/jmh 的 java micro benchmark 测试 “scala 比 java 快”——这对于任何类型的程序来说都不是真的。此外,由于 JIT 优化等原因,在 JVM 上编写正确的微基准测试比像您正在做的那样编写循环要困难得多。请参阅How do I write a correct micro-benchmark in Java? 不要被无意义的基准分数吓倒:看到比较代码是件好事。目前:Scala 有可能对其函数式编程数据结构和算法(即不可变数据)进行更好的优化。但是 java 可能在更接近 JVM(=uglier?)方面处于领先地位,更多的人力资源已经处理了代码。 做一个正确的基准测试。我已将您的 Scala 代码移动到一个函数中,连续调用 4 次,结果为耗时:283 毫秒,元素数:30000 耗时:34 毫秒,元素数:30000 耗时:17 毫秒,元素:30000 耗时:3 毫秒,元素数量:30000 作为副本关闭:尽管检查的代码不同,但这两个问题都缺乏适当的基准测试,Shipilev 的最佳答案是一个很好的例子,即“Scala 比 Java 快/慢”的问题是多么有争议。还要关注relevant post 和他的博客整体 【参考方案1】:

Scala 并不比 Java 快(Java 也不比 Scala 快)。

你的“基准”质量很差,你应该使用 JMH (http://openjdk.java.net/projects/code-tools/jmh/) 或类似的工具来做微基准。主要原因是消除死代码和预热代码。见http://java-performance.info/jmh/和http://www.oracle.com/technetwork/articles/java/architect-benchmarking-2266277.html

Java 中的优化不是由编译器完成的,而是由 JVM(例如 Hotspot)完成的。因此,Scala/Java 或 Clojure 编译器生成的“字节码”之间不太可能存在真正的性能差异。

如果您想深入了解这一点,只需使用 Class File Disassembler 分析字节码(即 Java 或 Scala 编译器生成的 .class 文件)

javap -c YourClass.class

【讨论】:

以上是关于scala 是不是比 java 更快,因为两者都在 JVM 上运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

.ix() 是不是总是比 .loc() 和 .iloc() 更好,因为它更快并且支持整数和标签访问?

访问最终局部变量是不是比 Java 中的类变量更快?

是啥让 SPI 比 I2C 协议更快 [关闭]

使用编码器如何比 java 序列化快得多?

使用 IP 地址是不是比使用域名更快?

Queue.Synchronized 是不是比使用 Lock() 更快?