Java 8 并行排序 vs Scala 并行排序

所以我只是在学习新的Java 8,特别是lambdas和日期和时间api。我把它和scala进行了比较。我的基本想法是找到命令式,流和并行流之间的执行时间差。所以我决定创建一个图书馆应用程序,并做一些操作,如搜索,过滤,排序等。我创建了一个图书馆类,其中包含一个名为“书籍”的列表字段,并用 1000 本书填充了它。然后创建了一个用于搜索的功能界面,并在所有三种样式中进行了一些操作。一切都很好。我的代码是:

// Functional Interface
interface Search<T> {
    public void search(T t);
}

// Library class
final Library library = new Library();
// This just creates some random book objects.
final List<Book> books = collectBooks();

final Search<List<Book>> parallelSearch = (bks) -> library.findAndPrintBooksParallel(bks);

// Parallel Operations
private void findAndPrintBooksParallel(List<Book> books) {
    books.parallelStream()
        .filter(b -> b.getAuthor().equals("J.K. Rowling"))
        .sorted((x,y) -> x.getAuthor().compareTo(y.getAuthor()))
        .map(Book::getIsbn)
        .forEach(Library::waitAndPrintRecord);
}

现在我试图在scala中重新创建相同的程序,看看执行是否更快?令人惊讶的是,scala不允许我进行并行排序(或者可能是我在这里无知)。我的 scala 库是

// Again some random book objects as a list
val books = collectBooks

// Parallel operation
books.par filter(_.author == "J.K. Rowling") map (_.isdn) foreach waitAndPrint

这里给出了一个ParSeq。这没有排序方法。有没有办法在scala中创建一个并行排序,我的书单。所以我可以这样写:books.par

books.par filter(_.author == "J.K. Rowling") sortWith (_.author < _.author) map (_.isdn) foreach waitAndPrint

非常感谢您的帮助。谢谢。


答案 1

可以在 scala 中实现并行排序,例如 http://blog.yunglinho.com/blog/2013/03/19/parallel-external-merge-sort/ 。我不知道为什么ParSeq没有在其API中提供排序。请注意,有许多替代方法,因此不一定假设 ParSeq 的结果通常代表 Scala 并行性。(但是基准是有价值的,我祝你和你的基准一切顺利)。.par


答案 2

我对scala非常陌生,但据我所知:排序本身永远不会是并行的,只有与Java数组之间的转换才有可能。sorted 由 scala.collection.SeqLike 提供,只试试这个链接: GitHub.Com/Scala/Scala/blob/master/src/library/scala/collection/...


推荐