我最近一直在潜入Scala,并且(可能是可以预见的)花了相当多的时间研究Scala标准库中的不可变集合API.
我正在编写一个应用程序,它必须在大型集合上执行许多+/-操作.出于这个原因,我想确保我选择的实现是一个所谓的"持久"数据结构,这样我就可以避免进行写时复制.我看到马丁奥德斯基的这个答案,但它并没有真正解决我的问题.
我编写了以下测试代码来比较ListSet和HashSet的性能以进行添加操作:
import scala.collection.immutable._
object TestListSet extends App {
var set = new ListSet[Int]
for(i <- 0 to 100000) {
set += i
}
}
object TestHashSet extends App {
var set = new HashSet[Int]
for(i <- 0 to 100000) {
set += i
}
}
Run Code Online (Sandbox Code Playgroud)
这是HashSet的粗略运行时测量:
$ time scala TestHashSet
real 0m0.955s
user 0m1.192s
sys 0m0.147s
Run Code Online (Sandbox Code Playgroud)
和ListSet:
$ time scala TestListSet
real 0m30.516s
user 0m30.612s
sys 0m0.168s
Run Code Online (Sandbox Code Playgroud)
单链表上的缺点是恒定时间操作,但这种性能看起来线性或更差.这个性能是否与需要检查集合中的每个元素以确保对象相等以符合Set的无重复不变量有关?如果是这种情况,我意识到它与"持久性"无关.
至于官方文档,我所能找到的只是以下页面,但似乎不完整:Scala 2.8 Collections API - Performance Characteristics …
我正在Scala中编写一个使用Akka actor的分布式应用程序.我有一些数据结构,我的远程演员愉快地序列化,通过网络发送,并在没有任何额外帮助的情况下反序列化.
对于日志记录,我想序列化包含这些对象的案例类.我在akka项目网站上阅读了序列化文档,但我想知道是否有更简单的方法来完成这项工作,因为Akka显然知道如何序列化这些对象.
编辑2011 年11月5日以回应Viktor的评论
该应用程序是分布式马尔可夫决策过程引擎.
我正在尝试序列化其中一件事:
case class POMDPIteration(
observations: Set[(AgentRef, State)],
rewards: Set[(AgentRef, Float)],
actions: Set[(AgentRef, Action)],
state: State
)
Run Code Online (Sandbox Code Playgroud)
这是AgentRef的定义:
case class AgentRef(
clientManagerID: Int,
agentNumber: Int,
agentType: AgentType
)
Run Code Online (Sandbox Code Playgroud)
Action并且AgentType只是类型的别名Symbol
为了缩短这一点,State的定义如下:https: //github.com/ConnorDoyle/EnMAS/blob/master/src/main/scala/org/enmas/pomdp/State.scala
我成功地在远程actor中发送包含State类型对象的case类,没有任何问题.我只是想知道是否有办法获得Akka用于我自己目的的序列化例程.
Akka在进行消息传递时的隐式序列化很容易,但是从文档中可以看出,明确要求Akka提供序列化版本很难.也许我误解了文档,或者遗漏了一些重要的东西.