加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala与Java性能(HashSet和二进制代码)

发布时间:2020-12-16 09:12:23 所属栏目:安全 来源:网络整理
导读:我遇到了 Scala和 Java版本的几乎相同的实现之间的性能差异.我看到Java版本比Scala版本快68%.任何想法为什么会发生这种情况? Java版本: public class Util {public static Set String toBigramsJava(String s1) { Set String nx = new HashSet String ();
我遇到了 Scala和 Java版本的几乎相同的实现之间的性能差异.我看到Java版本比Scala版本快68%.任何想法为什么会发生这种情况?

Java版本:

public class Util {
public static Set < String > toBigramsJava(String s1) {
    Set <String> nx = new HashSet <String> ();
    for (int i = 0; i < s1.length() - 1; i++) {
        char x1 = s1.charAt(i);
        char x2 = s1.charAt(i + 1);
        String tmp = "" + x1 + x2;
        nx.add(tmp);
    }
    return nx;
}

}

Scala版本:

object Util {
def toBigramsScala(str: String): scala.collection.mutable.Set[String] = {
    val hash: scala.collection.mutable.Set[String] = scala.collection.mutable.HashSet[String]()
    for (i <-0 to str.length - 2) {
        val x1 = str.charAt(i)
        val x2 = str.charAt(i + 1)
        val tmp = "" + x1 + x2
        hash.add(tmp)
    }
    return hash
}

}

检测结果:

阶> Util.time(for(i< -1到1000000){Util.toBigramsScala(“test test abc de”)})
17:00:05.034 [info]有一些事情:1985ms

Util.time(for(i< -1到1000000){Util.toBigramsJava(“test test abc de”)})
17:01:51.597 [信息]有些事情:623ms

系统:

我在Ubuntu 14.04上运行了4核和8Gig RAM. Java版本1.7.0_45,Scala版本2.10.2.

我的blog有一些更多的信息.

解决方法

我与这个scala版本大致相同的结果

object Util {
  def toBigramsScala(str: String) = {
    val hash = scala.collection.mutable.Set.empty[String]
    var i: Int = 0
    while (i <  str.length - 1) {
      val x1 = str.charAt(i)
      val x2 = str.charAt(i + 1)
      val tmp = new StringBuilder().append(x1).append(x2).toString()
      hash.add(tmp)
      i += 1
    }
    hash
  }
}

因为我记得在scala中实现的循环,作为对Function0的apply()方法的调用,它是变形方法调用(来自JVM / JIT的观点).再加上javac的一些字符串连接优化.

我没有检查我的假设,寻找生成字节码,但替换为while
和StringBuilder的字符串连接使差异可以忽略不计.

Time for Java Version: 451 millis
Time for Scala Version: 589 millis

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读