Question PowerShell et le framework dotnet 3.5
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 10 ans 2 mois #17881
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:PowerShell et le framework dotnet 3.5
Pour info, si on utilise des scalaires cette classe est préférable à Compare-Object :
[code:1]
$base=1..10000
$final=10000..20000
measure-Command {
$set1 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set2 = New-Object System.Collections.Generic.HashSet`[object](,$final)
$set3 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set1.ExceptWith($final)
$set2.ExceptWith($base)
$set3.InterSectWith($final)
}
#TotalSeconds : 0,0061802
measure-Command {
$result=Compare-Object -ReferenceObject $base -DifferenceObject $final -include
}
#TotalSeconds : 45,4109085
$base=1..10000|% {$_.tostring()}
$final=10000..20000|% {$_.tostring()}
measure-Command {
$set1 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set2 = New-Object System.Collections.Generic.HashSet`[object](,$final)
$set3 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set1.ExceptWith($final)
$set2.ExceptWith($base)
$set3.InterSectWith($final)
}
#TotalSeconds : 0,0060648
measure-Command {
$result=Compare-Object -ReferenceObject $base -DifferenceObject $final
}
#TotalSeconds : 44,9446043
[/code:1]
On peut mélanger les éléments du tableaux, mais sans impact majeur :
[code:1]
Function Shuffle($list)
{
#from : stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp
$rng = new-Object System.Random
$n = $list.Count
while ($n -gt 1) {
$n--
$k = $rng.Next($n + 1)
$value = $list[$k]
$list[$k] = $list[$n];
$list[$n] = $value;
}
}
$base=1..10000
Shuffle $base
$final=10000..20000
Shuffle $final
measure-Command {
$set1 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set2 = New-Object System.Collections.Generic.HashSet`[object](,$final)
$set3 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set1.ExceptWith($final)
$set2.ExceptWith($base)
$set3.InterSectWith($final)
}
#TotalSeconds : 0,0067118
measure-Command {
$result=Compare-Object -ReferenceObject $base -DifferenceObject $final
}
#TotalSeconds : 45,5292967
[/code:1]
[code:1]
$base=1..10000
$final=10000..20000
measure-Command {
$set1 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set2 = New-Object System.Collections.Generic.HashSet`[object](,$final)
$set3 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set1.ExceptWith($final)
$set2.ExceptWith($base)
$set3.InterSectWith($final)
}
#TotalSeconds : 0,0061802
measure-Command {
$result=Compare-Object -ReferenceObject $base -DifferenceObject $final -include
}
#TotalSeconds : 45,4109085
$base=1..10000|% {$_.tostring()}
$final=10000..20000|% {$_.tostring()}
measure-Command {
$set1 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set2 = New-Object System.Collections.Generic.HashSet`[object](,$final)
$set3 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set1.ExceptWith($final)
$set2.ExceptWith($base)
$set3.InterSectWith($final)
}
#TotalSeconds : 0,0060648
measure-Command {
$result=Compare-Object -ReferenceObject $base -DifferenceObject $final
}
#TotalSeconds : 44,9446043
[/code:1]
On peut mélanger les éléments du tableaux, mais sans impact majeur :
[code:1]
Function Shuffle($list)
{
#from : stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp
$rng = new-Object System.Random
$n = $list.Count
while ($n -gt 1) {
$n--
$k = $rng.Next($n + 1)
$value = $list[$k]
$list[$k] = $list[$n];
$list[$n] = $value;
}
}
$base=1..10000
Shuffle $base
$final=10000..20000
Shuffle $final
measure-Command {
$set1 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set2 = New-Object System.Collections.Generic.HashSet`[object](,$final)
$set3 = New-Object System.Collections.Generic.HashSet`[object](,$base)
$set1.ExceptWith($final)
$set2.ExceptWith($base)
$set3.InterSectWith($final)
}
#TotalSeconds : 0,0067118
measure-Command {
$result=Compare-Object -ReferenceObject $base -DifferenceObject $final
}
#TotalSeconds : 45,5292967
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 9 ans 11 mois #18237
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:PowerShell et le framework dotnet 3.5
Whooaa !!! Merci Laurent !
En particulier pour la classe HashSet que je ne connaissais
pas !!!
En particulier pour la classe HashSet que je ne connaissais
pas !!!
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 8 mois #18978
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:PowerShell et le framework dotnet 3.5
Les traitements sont par défaut sensible à la casse.
Un exemple pour des traitements insensible à la casse :
[code:1]
$CodeCS=@'
using System;
using System.Collections.Generic;
public class MyStringComparer : EqualityComparer<string>
{
public override bool Equals(string s1, string s2)
{
return s1.Equals(s2, StringComparison.CurrentCultureIgnoreCase);
}
public override int GetHashCode(string s)
{
return base.GetHashCode();
}
}
'@
Add-type -TypeDefinition $codecs
[string[]] $Names=@('un','deux','trois','quatre','Cinq','Six')
[string[]] $Keys=@('Deux','Quatre','Six')
$Set = New-Object System.Collections.Generic.HashSet[String](,$Names)
$Set.IntersectWith($Keys)
$Set
#Six : une seule correspondance -> case sensitive
$MyComparer=New-Object MyStringComparer
$Set = New-Object System.Collections.Generic.HashSet[String] -argumentlist $Names,$MyComparer
$Set.IntersectWith($Keys)
$Set
# deux
# quatre
# Six
#Toutes les correspondances -> case insensitive
[/code:1]
Un exemple pour des traitements insensible à la casse :
[code:1]
$CodeCS=@'
using System;
using System.Collections.Generic;
public class MyStringComparer : EqualityComparer<string>
{
public override bool Equals(string s1, string s2)
{
return s1.Equals(s2, StringComparison.CurrentCultureIgnoreCase);
}
public override int GetHashCode(string s)
{
return base.GetHashCode();
}
}
'@
Add-type -TypeDefinition $codecs
[string[]] $Names=@('un','deux','trois','quatre','Cinq','Six')
[string[]] $Keys=@('Deux','Quatre','Six')
$Set = New-Object System.Collections.Generic.HashSet[String](,$Names)
$Set.IntersectWith($Keys)
$Set
#Six : une seule correspondance -> case sensitive
$MyComparer=New-Object MyStringComparer
$Set = New-Object System.Collections.Generic.HashSet[String] -argumentlist $Names,$MyComparer
$Set.IntersectWith($Keys)
$Set
# deux
# quatre
# Six
#Toutes les correspondances -> case insensitive
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 8 ans 2 mois #22133
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:PowerShell et le framework dotnet 3.5
Un article
sur les performance entre certains cmdlets et une hashset.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.068 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- PowerShell et le framework dotnet 3.5