.net 修复此PLINQ,使其比普通LINQ运行得更快 脚本

.net 修复此PLINQ,使其比普通LINQ运行得更快 脚本,.net,vb.net,linq,parallel-processing,permutation,.net,Vb.net,Linq,Parallel Processing,Permutation,我在下面使用这个函数,我想利用并行性(它们假定的好处),但是,当我尝试实现一个简单的parallelLINQ技术时,结果是非常负面的,我不明白为什么,但总执行时间相比增加了10左右 <DebuggerStepThrough> Public Shared Function PermuteCharacters(ByVal charSet As Char(), ByVal length As Integer,

我在下面使用这个函数,我想利用并行性(它们假定的好处),但是,当我尝试实现一个简单的parallelLINQ技术时,结果是非常负面的,我不明白为什么,但总执行时间相比增加了10左右

<DebuggerStepThrough>
Public Shared Function PermuteCharacters(ByVal charSet As Char(),
                                         ByVal length As Integer,
                                         ByVal allowRepetition As Boolean) As IEnumerable(Of String)

If (charSet.Count <> charSet.Distinct.Count) Then
    Throw New ArgumentException("Char-set contains duplicated characters.", "charSet")
    Return Nothing
End If

If (length = 1) Then
    Return charSet.Select(Function(c As Char)
                              Return New String(New Char() {c})
                          End Function)
End If

If (allowRepetition) Then
    Return PermuteCharacters(charSet, length:=length - 1, allowRepetition:=True).
           AsParallel.AsOrdered.
           SelectMany(Function(str As String)
                          Return charSet
                      End Function,
                      Function(str As String, c As Char)
                          Return str & c
                      End Function)

Else
    Return PermuteCharacters(charSet, length:=length - 1, allowRepetition:=False).
       AsParallel.AsOrdered.
       SelectMany(Function(x As String) charSet,
                  Function(str As String, c As Char)
                      If Not str.Contains(c) Then
                          Return str & c
                      Else
                          Return Nothing
                      End If
                  End Function).
    Where(Function(value As String) value IsNot Nothing)

End If

End Function
如果没有平行度,大约需要10秒

平行度大约需要50秒

问题:

我想了解为什么会发生这种情况,以及如何修复/改进它?

您的字符串方法不够复杂,所以PLINQ候选对象很糟糕。每次手术所需的时间太少了。因此,PLINQ开销高于收益。谢谢。换句话说,你的意思是我应该只考虑SelectMany的每个函数的开销,而不是源或返回的“数据”(集合)到底有多大?。这篇文章也帮了我一点忙:一个函数/操作需要的并行化时间越多,它就越适合。您的字符串方法不够复杂,因此PLINQ候选项很糟糕。每次手术所需的时间太少了。因此,PLINQ开销高于收益。谢谢。换句话说,你的意思是我应该只考虑SelectMany的每个函数的开销,而不是源或返回的“数据”(集合)到底有多大?。这篇文章也帮了我一点忙:一个函数/操作需要的并行化时间越多,它就越适合。
Dim permutations As IEnumerable(Of String) =
    PermuteCharacters("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 5, allowRepetition:=True)

File.WriteAllLines("C:\test.txt", permutations)