Yammer从Scala转向Java

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

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

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

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

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

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

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

\u0026#xD;\n
\u0026#xD;\n
\u0026#xD;\nscala\u0026gt;\u0026#xD;\n  var start = System.currentTimeMillis();\u0026#xD;\n  var total = 0;for(i \u0026lt;- 0 until 100000) { total += i };\u0026#xD;\n  var end = System.currentTimeMillis();\u0026#xD;\n  println(end-start);\u0026#xD;\n  println(total);\u0026#xD;\n114\u0026#xD;\nscala\u0026gt;\u0026#xD;\nscala\u0026lt; \u0026#xD;\n  var start = System.currentTimeMillis();\u0026#xD;\n  var total = 0;var i=0;while(i \u0026lt; 100000) { i=i+1;total += i };\u0026#xD;\n  var end = System.currentTimeMillis();\u0026#xD;\n  println(end-start);\u0026#xD;\n  println(total);\u0026#xD;\n8\u0026#xD;\n
\u0026#xD;\n
\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n
\u0026#xD;\n
\u0026#xD;\nscala\u0026gt;\u0026#xD;\n  val m = new scala.collection.mutable.HashMap[Int,Int]; \u0026#xD;\n  var i = 0;\u0026#xD;\n  var start = System.currentTimeMillis();\u0026#xD;\n  while(i\u0026lt;100000) { i=i+1;m.put(i,i);};\u0026#xD;\n  var end = System.currentTimeMillis();\u0026#xD;\n  println(end-start);\u0026#xD;\n  println(m.size)\u0026#xD;\n101\u0026#xD;\nscala\u0026gt;\u0026#xD;\n  val m = new java.util.HashMap[Int,Int]; \u0026#xD;\n  var i = 0;\u0026#xD;\n  var start = System.currentTimeMillis();\u0026#xD;\n  while(i\u0026lt;100000) { i=i+1;m.put(i,i);};\u0026#xD;\n  var end = System.currentTimeMillis();\u0026#xD;\n  println(end-start);\u0026#xD;\n  println(m.size)\u0026#xD;\n28\u0026#xD;\nscala\u0026gt;\u0026#xD;\n  val m = new java.util.concurrent.ConcurrentHashMap[Int,Int]; \u0026#xD;\n  var i = 0;\u0026#xD;\n  var start = System.currentTimeMillis();\u0026#xD;\n  while(i\u0026lt;100000) { i=i+1;m.put(i,i);};\u0026#xD;\n  var end = System.currentTimeMillis();\u0026#xD;\n  println(end-start);\u0026#xD;\n  println(m.size)\u0026#xD;\n55\u0026#xD;\n
\u0026#xD;\n
\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

\u0026#xD;\n

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基本流程控制语句

package com.org.lxh;import java.util.Scanner;/*** Java流程控制语句,if,if……else,switch,while,do……while,for等等* author hemmingway <hemmingway163.com>***/ public class CommCtrl {/*** param args*/public static void main(String[] args) {// TODO Auto-…

Mozilla考虑支持H.264

历史上&#xff0c;Mozilla曾拒绝过使用非开放的编码解码器&#xff08;如H.264&#xff09;&#xff0c;InfoQ此前也就这一话题进行过报导。Mozilla之所以拒绝主要是因为支持H.264与它的思想观念不一&#xff0c;因为H.264有专利覆盖&#xff0c;并且由MPEG-LA许可使用。人们不…

芯昇 CM32M101A 固件库 W25Q128JWSIQ 驱动

注意:此型号的JEDEC ID是0xEF6018,不同于网上满天飞的驱动,调试此器件驱动一定要确认。 官方SDK里面的驱动有问题,读写数据乱码,个人感觉是完全搬运野火电子的,因为除了名不一样,格式一毛一样。 drv_spi.h #ifndef _DRV_SPI_H_ #define _DRV_SPI_H_#ifdef __cplusplu…

MATLAB实现简单目标跟踪

MATLAB实现简单目标跟踪 预处理:中值滤波; 目标检测:二值化 后处理:形态学滤波或者连通性处理 目标跟踪:计算形心 clear all; close all; %预处理-中值滤波 t = imread(1.png);%原始图像 t1 = rgb2gray(t);%灰度图像 t2=imnoise(t1,salt & pepper,0.3);%加入椒盐噪声…

Java数组操作

package com.org.lxh;import java.util.Arrays;/*** 讲解Java数组* author hemmingway <hemmingway163.com>**/ public class ArrayDemo {/*** param args*/SuppressWarnings("unused") //元注释&#xff0c;忽略没有使用的变量public static void main(Strin…

振臂高呼式的写作:谈肖亦农的《毛乌素绿色传奇》

这是2011年底我与肖亦农和鄂尔多斯文联主席乌力吉布林在人民大会堂参加中国作家协会代表大会的合影&#xff0c;半年后我们又在人民大会堂相聚&#xff0c;是参加肖亦农的最新作品《毛乌素绿色传奇》研讨会。 肖亦农是我多年的朋友&#xff0c;是兄长&#xff0c;也是内蒙老乡&…

蜕变与成长中的青春创作:评论家谈少数民族青年作家的创作

在日前由中国作家协会主办&#xff0c;中国少数民族作家学会、《民族文学》杂志社协办的少数民族青年作家作品研讨会上&#xff0c;来自全国的10位少数民族青年写作者成为主要研讨对象。他们是照日格图(蒙古族)、苏笑嫣(蒙古族)、鲍尔金娜(蒙古族)、陶丽群(壮族)、马金莲(回族)…

Ubuntu 国内镜像源

中科大镜像站 阿里云镜像站 兰州大学镜像站 北京理工大学镜像站 浙江大学镜像站 清华大学镜像站

彩色图转化为灰度图

彩色图转化为灰度图 源文件 `timescale 1ns / 1ps module rgb2gary(input [7:0] rgb_r,input [7:0] rgb_g,input [7:0] rgb_b,output [7:0] gary); //Verilog不支持小数 // assign gary = 0.299 * rgb_r + 0.587 * rgb_g + 0.114 * rgb_b; wire [17:0] gary_te…

Java面向对象入门

package com.org.lxh;import java.util.Calendar;/*** 面向对象编程入门* author hemmingway <hemmingway163.com>**/ public class Chp6 {int num500; //成员变量public static int num2200; //静态变量public static final double PI3.1415926; /…

时间与经验的等待:谈几位少数民族“80后”和“90后”作家

照日格图是我欣赏的蒙古族青年散文家。两年前&#xff0c;我就读过他的《怀念一垛草》。这篇散文通过打草与草垛将故事连接在一起&#xff0c;表现了蒙古人质朴真实的生活和命运。那些既熟悉又陌生的细节让我有种莫名的感动&#xff0c;它既让我们了解了草原秋天的景象&#xf…

win10系统如何禁用驱动程序强制签名

1. 首先打开并登录操作系统左下角。开始菜单上单击选择设置 2. 在设置页面选择“更新和安全” 3.在”更新和安全页面“找到左侧的恢复选项&#xff0c;在右侧选择”立即重新启动” 4.在启动页面选择疑难解答 5. 进入疑难解答页面选择”高级选项“ 6.在”高级选项“页面中选择”…

说不尽的嘎达梅林:读郭雪波的长篇小说《青旗•嘎达梅林》

嘎达梅林做为一个民族英雄&#xff0c;已经是个永久的传奇。很多文学作品、电影、电视&#xff0c;还有音乐都表现过这个人物&#xff0c;使他的影响力已经超出了蒙古民族的范畴&#xff0c;成为整个中华民族的英雄人物长廊中的一个典型。正因为如此也给后来的写作者制造了难题…

实现图像的二值化

实现图像的二值化 源文件 `timescale 1ns / 1ps module binarization(//module clockinput clk , // 时钟信号input rst_n , // 复位信号(低有效)//图像处理前的数据接口input ycbcr_vsync , // vsync信号input ycbcr_hsync , // hsync信号input ycbcr_de , // data enable…

Java面向对象进阶

相关额外的代码待上传。。。 /*** 面向对象进阶*/ package com.org.lxh;import com.org.lxh.ext.Demo; import com.org.lxh.impl.AysTest; import com.org.lxh.impl.Person; import com.org.lxh.impl.Test; import com.org.lxh.inter.InterTest; import com.org.lxh.obj.Addres…

2012 IBM软件技术峰会:IBM与开发者谈四大热门领域看法

8月23日&#xff0c;以“技术维新&#xff0c;预见未来”为主题的2012 IBM软件技术峰会在京举行&#xff0c;本次大会在“大数据、云计算、敏捷、移动”四个领域展开讨论&#xff0c;IBM全球副总裁兼中国开发中心总经理王阳、IBM软件集团Rational总经理Kristof Kloeckner、IBM系…

实现图像的中值滤波

实现图像的中值滤波 底层模块 `timescale 1ns / 1ps module median_filter #(parameter DATA_WIDTH = 8 ) (input clk , //pixel clkinput reset_p ,input [7:0] data_in ,input data_in_valid ,input data_in_hs ,input dat…

我的博客今天6岁298天了,我领取了元老博主徽章

我的博客今天6岁298天了&#xff0c;我领取了徽章. 2005.11.26&#xff0c;我在新浪博客安家。1999.08.20&#xff0c;我写下了第一篇博文&#xff1a;《小说是读者的艺术》。2006.04.20&#xff0c;我上传了第一张图片到相册。至今&#xff0c;我的博客共获得845,523次访问。…

今天无聊弄得C++

// chp2.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <stdlib.h> #include <string.h> #include <time.h> #include <math.h>//数据结构 //数组(Array)、堆栈(Stack)、队列(queue)、链表(Linked List)、树(Tree)、图…

“80后”作家应扮演更重要的角色

曾经在《北京文学》月刊社做副主编&#xff0c;现在做文学批评家和图书策划人&#xff0c;在他的眼里&#xff0c;新生代作家是文学的未来&#xff0c;也是文学不会消亡的保证。他对新生代的关注是一贯的。他策划过“60年代出生作家小说大展”、“好看小说大展”“新女性随笔系…