[译]Scala Collection的性能

这是翻译自 Li HaoyiBenchmarking Scala Collections

Li Haoyi 的背景了解Scala的人都知道,虽然Scala的官方文档对集合框架的性能提供了定性的分析,但是Li Haoyi的这篇文章定量的比较了各个框架类的性能,非常有参考意义,也便于你更好的正确的选择 Scala 集合中的类。

这篇文章从经验的角度深入研究了Scala集合库的运行特性。你也许已经看到了很多的从实现的角度介绍Scala集合库的文章(inheritance hierarchies, CanBuildFrom, 等等),但是很少有人写这些集合运行时的行为特性。

ListVector快,还是VectorList快?使用未装箱的数组存储基本类型可以节省多少内存?什么时候你会执行一些性能的技巧,比如预分配大小的数组、使用while-loop取代foreach调用等,这些技巧真的有效么?声明var l: List还是val b: mutable.Buffer?这篇文章会给你答案。

阅读全文

[译]JVM上最快的Bloom filter实现

英文原始出处: Bloom filter for Scala, the fastest for JVM

本文介绍的是我用Scala实现的Bloom filter。 源代码在github上。依照性能测试结果,它是JVM上的最快的Bloom filter实现。零分配(Zero-allocation)和高度优化的代码。 无内存限制,所以没有包含元素的数量限制和可控的误报率(false positive rate)。
扩展:可插拔的Hash算法,任意的元素类型。
没错,它使用sun.misc.unsafe

阅读全文

Scala集合技术手册出版了

拙著《Scala集合技术手册》出版了,详细信息请看 这里

这是我在学习和使用Scala过程中的技术总结和探索。

市面上第一本全面介绍Scala集合框架的图书。

首部国人原创中文Scala图书。

编辑推荐
√ Scala集合库不可多得的中文资料
√ 作为Scala的制胜法宝本书教你如何驾驭
√ 面向实际问题用示例代码讲解类的使用和原理
√ 全新角度实现基本数据结构是提升功力的不二法门

挖财架构师《 Scala 函数式编程》译者 王宏江 作序

推荐
√ 极牛创始人 CEO 吴际超
√ 《快学Scala》译者 高宇翔
√ 阿里巴巴 善马(柴克斌)
√ 联想 柴明贵

[译]Scala DSL教程: 实现一个web框架路由器

原文: Scala DSL tutorial - writing a web framework router, 作者: Tymon Tobolski

译者按:
Scala非常适合实现DSL(Domain-specific language)。我在使用Scala的过程中印象深刻的是scalatestspray-routing,

比如scalatest的测试代码的编写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import collection.mutable.Stack
import org.scalatest._
class ExampleSpec extends FlatSpec with Matchers {
"A Stack" should "pop values in last-in-first-out order" in {
val stack = new Stack[Int]
stack.push(1)
stack.push(2)
stack.pop() should be (2)
stack.pop() should be (1)
}
it should "throw NoSuchElementException if an empty stack is popped" in {
val emptyStack = new Stack[Int]
a [NoSuchElementException] should be thrownBy {
emptyStack.pop()
}
}
}

或者 akka-http的路由(route)的配置 (akka-http可以看作是spray 2.0的版本,因为作者现在在lightbend,也就是原先的typesafe公司开发akka-http):

1
2
3
4
5
6
7
8
9
10
11
12
val route =
get {
pathSingleSlash {
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`,"<html><body>Hello world!</body></html>"))
} ~
path("ping") {
complete("PONG!")
} ~
path("crash") {
sys.error("BOOM!")
}
}

可以看到,使用Scala实现的DSL非常简洁,也符合人类便于阅读的方式。但是我们如何实现自己的DSL呢?文末有几篇参考文档,介绍了使用Scala实现DSL的技术,但是本文翻译的这篇文章,使用Scala实现了一个鸡蛋的web路由DSL,步骤详细,代码简单,所以我特意翻译了一下。以下内容(除了参考文档)是对原文的翻译。

阅读全文

更好的Scala I/O: better-files

对于使用Scala的程序员来说, I/O操作如文件的读写通常使用scala.io.Source来实现。但是这个类功能还是欠缺的,而且功能混乱,因此在Scala类库的增强提案(Scala IO fix-up/overhaul)中如何改进它争论相当的大,甚至有些开发者提议将这个库废掉,让社区实现的第三方来完成这方面的工作,或者引导开发者使用java.nio来实现I/O操作。

当然,作为一个使用Scala的公司来说,可能会自己实现了辅助的I/O操作的方法, 比如类似FileUtils等名称的一些类。Java程序员可能已经熟悉了使用java.nio.file.FilesGuavaApache common-iojodd FileUtil等开源I/O库,但是如果使用Scala进行I/O操作时,虽然还是可以使用这些Java I/O库,但是毕竟还是不是那么纯粹,因此,我们可以关注一下Scala实现的I/O库,比如sbt ioAmmonite-Opsbetter-files等。

本文为你推荐better-files

阅读全文

Scala native即将发布

洛桑联邦理工学院(EPFL)发布了一个新的网站http://www.scala-native.org/,他们宣布了一个新的项目 Scala Native,但是没有公布具体的内容,只有"coming soon"的提示, 但是网站上唯一的提示 "Your favourite language gets closer to bare metal." 隐约透漏它可能是可以使用Scala编程语言编译成本机代码的项目。

Scala除了纵向发展外(Scala本身语言的扩展), 也在横向的发展, 比如Scala.js将Scala语言引入到Javascript中,它可以将Scala语言编译成javascript。因此有理由相信,这个即将发布的项目可以将Scala代码编译成本机代码,这样就可以脱离虚拟机直接运行了。

阅读全文

Scala Async 库

在我以前的文章中,我介绍了Scala Future and PromiseFuture代表一个异步计算,你可以设置你的回调函数或者利用Await.result等待获取异步计算的结果,你还可以组合多个future为一个新的futurePromise让你可以控制是否完成计算还是抛出异常,它的future方法返回一个Future对象,completesuccessfailure允许你完成计算。如果想要同步操作,可以使用Await.result等待Future完成或者超时,对于没有实现Awaitable的代码块,可以使用blocking方法实现同步执行。

阅读全文

Scala 魔法函数

Scala有一些语法糖,让一些特定名称的函数拥有一些特殊的能力。这些语法糖并没有专门的文档介绍,只是散落在不同的文章和教程中。本文整理里这些魔法函数,并通过例子演示它们的功能。

阅读全文

Scala编程的蛋糕模式和依赖注入

如果你是一个Java开发者,熟悉 依赖注入 模式, 深度依赖Spring框架的话,在使用Scala做开发时,会问一个问题,在Scala世界里,如何实现类似Spring框架的依赖注入呢?

尽管函数式编程的信徒认为他们不需要DI框架,高阶(high-order)函数足够了。但是对于同时支持面向对象的编程和函数式编程的Scala来说,依赖注入是很好的实现应用的一种设计模式。
蛋糕模式(Cake pattern)是Scala实现依赖注入的方式之一。
蛋糕模式是 Scala 之父 Martin Odersky 在其论文 Scalable Component Abstractions 中首先提到。

什么是蛋糕模式呢? 一个非正式的但是很形象的解释是:

  • 蛋糕有很多风味, 你可以根据你的需要增加相应的风味。依赖注入就是增加调料。
  • 蛋糕有很多层 (layer)。如果你想要一个更大的蛋糕你就可以增加更多的层。

我们先以Spring常用的User数据库读取的实现为例,看看Scala 风格的依赖注入(蛋糕模式)是如何实现的。

阅读全文