.net 修复此PLINQ,使其比普通LINQ运行得更快 脚本
我在下面使用这个函数,我想利用并行性(它们假定的好处),但是,当我尝试实现一个简单的parallelLINQ技术时,结果是非常负面的,我不明白为什么,但总执行时间相比增加了10左右.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,
<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)