Java 8 并行排序与 Scala 并行排序

Posted

技术标签:

【中文标题】Java 8 并行排序与 Scala 并行排序【英文标题】:Java 8 parallel sorting vs Scala parallel sorting 【发布时间】:2014-06-18 22:46:27 【问题描述】:

所以我只是在学习新的 Java 8,特别是 lambda 和日期和时间 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

这里books.par 给出了 ParSeq。这没有排序方法。有什么方法可以在 scala 中创建与我的书单的并行排序。所以我可以写这样的东西:

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

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

【问题讨论】:

sortedscala.collection.SeqLike only 提供,它只是委托给 java.util.Arrays.sort(T[] a, Comparator&lt;? super T&gt; c): GitHub.Com/Scala/Scala/blob/master/src/library/scala/collection/… 所以,排序本身永远不会并行,只有与 Java 数组之间的转换可能。 是的。我读过那个。我想知道我们是否可以向 ParSeq 添加排序方法。 你的问题的意图有点不清楚。您能否尝试以问题的形式重新表述您的内容,以便人们可以为您指出正确的方向?您是在问如何在 Scala 中进行并行排序? 也许您可以通过删除有关功能界面的部分以及所有这些来使问题更清楚,并只关注我认为是您的核心问题,即 - 有没有办法写一个简洁的,Scala 中面向序列的并行排序函数(类似于您在最后一个代码块中提供的语法)?恐怕您提供的有关 Java 8 的背景信息会使您的问题的意图有点不清楚。 也许 ***.com/questions/15589502/… 和 gist.github.com/atla/306844 是很好的起点 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Java 8 并行排序与 Scala 并行排序的主要内容,如果未能解决你的问题,请参考以下文章

奇偶排序

非并行样本排序是不是与快速排序具有相同的复杂性?

基数排序的并行版本未按预期运行(Java)

Java高级知识点:并行计算(外部排序) 及 死锁分析

并行全比较排序算法&并对角标排序

使用 Arrays.sort() 对并行数组进行排序