NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Yammer 从 Scala 转向 Java

  • 2012-02-01
  • 本文字数:2600 字

    阅读完需:约 9 分钟

近日,由 Yammer 雇员 Coda Hale 发给 Typesafe 的 Scala 商业管理层的邮件通过 YCombinator 被泄漏出来并在 GitHub 上刊出。该邮件确认 Yammer 正在将其基础设施栈从 Scala 迁回至 Java,原因在于 Scala 的复杂性与性能问题。

Yammer 的公关 Shelley Risk 向 InfoQ 证实该邮件只代表 Coda Hale 的个人意见而非 Yammer 的官方声明;随后,Coda Hale 又在 http://codahale.com/the-rest-of-the-story/ 上发表了一篇文章。在该文章中,Coda 澄清说这个消息是来自于 Donald Fischer( Typesafe 的 CEO)对早前一个 tweet 的回复。

更新:近日,Yammer 已经发布了声明,宣布对该问题的立场,声明证实了上述猜测。声明还指出任何语言都会有瑕疵(不仅仅是 Scala),该邮件只不过是尝试提出一些建议以改进 Scala 的性能与其他问题。最后,声明说到在构建任何高性能项目时(Scala 是其产品环境)都有一些问题需要解决;该邮件旨在帮助 Scala 不断改进。

虽然 Coda 并未打算公开该邮件,但他通过 Gist(后来被删除了)将其放到了 GitHub 上以获得其他朋友的反馈;然而,邮件内容后来被共享出来并得到了大范围传播。

回到 2010 年 8 月,Coda 在 Yammer Engineering 博客上说他们将要转向 Scala 。其目标是继续运行在 JVM(出于性能原因)上,这个转变的结果就是减少了约 50% 的代码:

Artie 最初的原型采用 Java 编写,但在一个周末的试验中,我尝试使用 Scala 2.8 重新实现一次。一天后,代码行数减少了约一半,并添加了几个特性。我震惊了,Java 开发者很容易找,但 Scala 团队却能完成更多工作

一年过后,这个决定发生了变化

目前在 Yammer,我们正在将基础设施迁回至 Java,同时以遗留库的形式继续对 Scala 提供支持。这个过程并不是那么急,我们刚刚开始,但需要很长时间。本质在于使用 Scala 而非 Java 作为我们的默认语言所产生的摩擦和复杂性并未被足够的生产力提升或是维护工作的减少而抵消。我们或许还会在产品中使用 Scala,但主要的开发将会使用 Java。

Stephen Colebourne(近日发表了文章 Is Scala the new EJB2?)对这封邮件做了点评,其要点总结如下:

  • 作为一门语言,Scala 中有很多颇具见地的想法。但它是门非常复杂的语言。
  • 除了 Scala 所引入的概念与具体实现外,要想编写地道的 Scala 还有一个文化的问题,有时突然就蹦出来一个最佳实践:完全不管不顾社区。
  • 我当然知道学习(以及教授)Scala 的困难程度与重要性。因为我们不可能在没人学习 Scala 的情况下找到人,这个事实非常重要。
  • 构建工具链导致开发很不舒服。这主要是因为 SBT 导致了 Maven 与 Ant 的边缘化——而他们是 Java 生态圈中的两个主要的构建工具。
  • 每个主要的 Scala 发布都不兼容于之前的版本,这导致 Scala 开发者总是在开发新的库并重新发明轮子。
  • 借助于分析与检查字节码,我们可以通过采用一些简单的规则实现 100 倍的改进:
    • 不要使用 for 循环
    • 不要使用 scala.collection.mutable
    • 不要使用 scala.collection.immutable
    • 总是使用 private[this]
    • 不要使用闭包
  • 我和开发团队讨论了这个问题(迁回至 Java),并且演示了两个代码基,结果是大家普遍同意进行切换。毫无疑问,我们肯定对 Scala 的某些方面还不太熟悉,但这不足以让我们还固守在 Scala 上。

其中一些问题可能不太重要(比如说,一门语言越流行,那么雇佣的开发者的经验就会越多),其中一些是根据经验来测试的。比如说,其中一条建议就是不要使用 for 循环。这可以通过如下代码进行测试:

复制代码
<pre>
scala>
var start = System.currentTimeMillis();
var total = 0;for(i <- 0 until 100000) { total += i };
var end = System.currentTimeMillis();
println(end-start);
println(total);
114
scala>
scala<
var start = System.currentTimeMillis();
var total = 0;var i=0;while(i < 100000) { i=i+1;total += i };
var end = System.currentTimeMillis();
println(end-start);
println(total);
8
</pre>

这里使用 for 循环(与"until"模式,很多 Scala 程序员都习惯这么用)要比对应的 while 循环慢很多,虽然使用 while 循环的可读性差一些。同样循环的 Java 实现对于 for 和 while 来说都是 2ms。

我们做的另一个测试是通过从一个包含 Integer 对象的数据集合中加载来看看可变 map 的性能(这可以在 Java 与 Scala 中进行对比,装箱的损耗应该差不多)。

复制代码
<pre>
scala>
val m = new scala.collection.mutable.HashMap[Int,Int];
var i = 0;
var start = System.currentTimeMillis();
while(i<100000) { i=i+1;m.put(i,i);};
var end = System.currentTimeMillis();
println(end-start);
println(m.size)
101
scala>
val m = new java.util.HashMap[Int,Int];
var i = 0;
var start = System.currentTimeMillis();
while(i<100000) { i=i+1;m.put(i,i);};
var end = System.currentTimeMillis();
println(end-start);
println(m.size)
28
scala>
val m = new java.util.concurrent.ConcurrentHashMap[Int,Int];
var i = 0;
var start = System.currentTimeMillis();
while(i<100000) { i=i+1;m.put(i,i);};
var end = System.currentTimeMillis();
println(end-start);
println(m.size)
55
</pre>

与 java.util.HashMap 相比,性能是相同的,与 java.util.concurrent.ConcurrentHashMap 相比,Java 的速度要比 Scala 快一倍。Java 集合类超越了 Scala(以上测试基于 OSX JVM 1.6.0_29 与 Scala 2.9.1,在文本撰写之际的最新版本)。

但遗憾的是,在 Scala 库 API 中有很多 Scala 集合,他们需要通过代码中的隐式转换从 Java 对象类型转换为 Scala 对象类型。出于性能原因,这需要大量的重写。

如果 Scala 编译器通过 invokedynamic 生成代码,那么闭包(lambdas)的性能还会得到改进,这是后续版本的 Scala 将会做的事情。此外,在 JDK 8 中(将会给 Java 带来 native lambdas 与 method handles)将会有很多的性能改进,这些改进都可以为 Scala 所用。

最后,Scala 在解决版本之间的不兼容问题上面临着越来越多的压力(不仅仅是2.9.2 与2.9.3 之间的小改进)。Typesafe 并未发布Scala 未来路线图的官方声明,也没有说明何时才会有稳定的二进制版本能够实现不同版本之间代码的兼容。如果能够实现向后兼容,那么就会有更多稳定的库出现,并且会形成一个社区仓库,这对未来有志于使用Scala 的开发者将大有裨益。

查看英文原文: Yammer Moving from Scala to Java

2012-02-01 04:285791
用户头像

发布了 88 篇内容, 共 258.6 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

瓴羊QuickBI,让企业更加清晰地管理和呈现数据

夜雨微澜

k8s部署springboot

tiandizhiguai

PoseiSwap 治理通证POSE登录PancakeSwap,开盘涨幅超2100%

大瞿科技

代码随想录训练营 Day07 - 哈希表(下)

jjn0703

引领算力革命:低代码开发平台助力大模型时代的突破与进步

不在线第一只蜗牛

低代码 算力 算力虚拟化

性能测试|基于JMeter 完成典型电商场景(首页浏览)的性能压测

霍格沃兹测试开发学社

性能测试 JMeter使用教程

数字化转型与架构-规划篇|谁是需求调研的对象?

数字随行

数字化转型

PoseiSwap 治理通证POSE登录PancakeSwap,开盘涨幅超2100%

股市老人

MQTT 服务新趋势:了解 MQTT 多租户架构

EMQ映云科技

物联网 mqtt 多租户

构建以数据为中心的全面预算管理系统

智达方通

数据驱动 业财融合 全面预算管理系统

FastGithub:github加速神器,解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问题。

汀丶人工智能

GitHub git加速

PoseiSwap 治理通证POSE登录PancakeSwap,开盘涨幅超2100%

EOSdreamer111

性能测试|JMeter取样器介绍(二)

霍格沃兹测试开发学社

#性能测试 JMeter使用教程

华为云CodeArts Check:带你掌握代码检查技巧,优化代码质量!

华为云PaaS服务小智

云计算 华为云 代码检查 代码检查、

探究C语言中的二叉树

智趣匠

PoseiSwap 治理通证POSE登录PancakeSwap,开盘涨幅超2100%

BlockChain先知

低代码——前端进阶的必修课

伤感汤姆布利柏

Last Week in Milvus

Zilliz

非结构化数据 Milvus Zilliz 向量数据库 zillizcloud

性能测试|JMeter压测结果分析

霍格沃兹测试开发学社

#性能测试 JMeter使用教程

信息安全大有希望!低代码开发平台为大数据时代保驾护航

加入高科技仿生人

低代码 信息安全 信息技术

颠覆数字化转型:探索低代码开发平台JNPF的黑科技

快乐非自愿限量之名

低代码 数字化 数智转型

2023容器网络趋势:CNI网络插件逐渐普及,Kube-OVN受欢迎度持续攀升

York

Kubernetes 云原生 容器网络 cni 容器网络方案

AIGC+HR|AI时代下,企业人力管理新解法

TE智库

人工智能 HR AIGC

性能测试|搭建性能监控平台

霍格沃兹测试开发学社

#性能测试

性能测试|Jmeter压测脚本录制与编写

霍格沃兹测试开发学社

#性能测试 JMeter使用教程

百度智能云入选北京市“算力伙伴”、“模型伙伴”!

彭飞

模块六:拆分电商服务为微服务

家有两宝

架构实战营

瓴羊QuickBI数据门户帮助企业高效管理和展示数据,使其更加明确易懂

对不起该用户已成仙‖

性能测试|JMeter取样器介绍(三)

霍格沃兹测试开发学社

#性能测试 JMeter使用教程

性能测试|JMeter逻辑控制器(一)

霍格沃兹测试开发学社

晴数智慧数据集名列北京市首批“人工智能大模型高质量数据集”,入选产业创新伙伴计划

Geek_2d6073

Yammer从Scala转向Java_Java_Alex Blewitt_InfoQ精选文章