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”)}) Util.time(for(i< -1到1000000){Util.toBigramsJava(“test test abc de”)}) 系统: 我在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 Time for Java Version: 451 millis Time for Scala Version: 589 millis (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |