TLDR; Leistungsmäßig Any
scheint langsamer zu sein (wenn ich das richtig eingestellt habe, um beide Werte fast gleichzeitig auszuwerten)
var list1 = Generate(1000000);
var forceListEval = list1.SingleOrDefault(o => o == "0123456789012");
if (forceListEval != "sdsdf")
{
var s = string.Empty;
var start2 = DateTime.Now;
if (!list1.Exists(o => o == "0123456789012"))
{
var end2 = DateTime.Now;
s += " Exists: " + end2.Subtract(start2);
}
var start1 = DateTime.Now;
if (!list1.Any(o => o == "0123456789012"))
{
var end1 = DateTime.Now;
s +=" Any: " +end1.Subtract(start1);
}
if (!s.Contains("sdfsd"))
{
}
Testlistengenerator:
private List<string> Generate(int count)
{
var list = new List<string>();
for (int i = 0; i < count; i++)
{
list.Add( new string(
Enumerable.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 13)
.Select(s =>
{
var cryptoResult = new byte[4];
new RNGCryptoServiceProvider().GetBytes(cryptoResult);
return s[new Random(BitConverter.ToInt32(cryptoResult, 0)).Next(s.Length)];
})
.ToArray()));
}
return list;
}
Mit 10M Datensätzen
" beliebig: 00:00:00.3770377 Vorhanden: 00:00:00.2490249"
Mit 5M Datensätzen
" beliebig: 00:00:00.0940094 Vorhanden: 00:00:00.1420142"
Mit 1M Datensätzen
" beliebig: 00:00:00.0180018 Vorhanden: 00:00:00.0090009"
Mit 500k, (ich habe auch die Reihenfolge umgedreht, in der sie ausgewertet werden, um zu sehen, ob es keine zusätzliche Operation gibt, die damit verbunden ist, welche davon zuerst läuft).
" Existiert: 00:00:00.0050005 beliebig: 00:00:00.0100010"
Mit 100k Datensätzen
" Existiert: 00:00:00.0010001 beliebig: 00:00:00.0020002"
Es scheint Any
um eine Größenordnung von 2 langsamer sein.
Bearbeiten: Für 5 und 10M Datensätze habe ich die Art und Weise, wie die Liste generiert wird, geändert und Exists
wurde plötzlich langsamer als Any
was darauf hindeutet, dass mit der Art und Weise, wie ich prüfe, etwas nicht stimmt.
Neuer Prüfmechanismus:
private static IEnumerable<string> Generate(int count)
{
var cripto = new RNGCryptoServiceProvider();
Func<string> getString = () => new string(
Enumerable.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 13)
.Select(s =>
{
var cryptoResult = new byte[4];
cripto.GetBytes(cryptoResult);
return s[new Random(BitConverter.ToInt32(cryptoResult, 0)).Next(s.Length)];
})
.ToArray());
var list = new ConcurrentBag<string>();
var x = Parallel.For(0, count, o => list.Add(getString()));
return list;
}
private static void Test()
{
var list = Generate(10000000);
var list1 = list.ToList();
var forceListEval = list1.SingleOrDefault(o => o == "0123456789012");
if (forceListEval != "sdsdf")
{
var s = string.Empty;
var start1 = DateTime.Now;
if (!list1.Any(o => o == "0123456789012"))
{
var end1 = DateTime.Now;
s += " Any: " + end1.Subtract(start1);
}
var start2 = DateTime.Now;
if (!list1.Exists(o => o == "0123456789012"))
{
var end2 = DateTime.Now;
s += " Exists: " + end2.Subtract(start2);
}
if (!s.Contains("sdfsd"))
{
}
}
Bearbeiten2: Um jeglichen Einfluss der erzeugten Testdaten zu eliminieren, habe ich alles in eine Datei geschrieben und lese es nun von dort.
private static void Test()
{
var list1 = File.ReadAllLines("test.txt").Take(500000).ToList();
var forceListEval = list1.SingleOrDefault(o => o == "0123456789012");
if (forceListEval != "sdsdf")
{
var s = string.Empty;
var start1 = DateTime.Now;
if (!list1.Any(o => o == "0123456789012"))
{
var end1 = DateTime.Now;
s += " Any: " + end1.Subtract(start1);
}
var start2 = DateTime.Now;
if (!list1.Exists(o => o == "0123456789012"))
{
var end2 = DateTime.Now;
s += " Exists: " + end2.Subtract(start2);
}
if (!s.Contains("sdfsd"))
{
}
}
}
10M
" beliebig: 00:00:00.1640164 Vorhanden: 00:00:00.0750075"
5M
" beliebig: 00:00:00.0810081 Vorhanden: 00:00:00.0360036"
1M
" beliebig: 00:00:00.0190019 Vorhanden: 00:00:00.0070007"
500k
" beliebig: 00:00:00.0120012 Vorhanden: 00:00:00.0040004"
10 Stimmen
Wie sieht der von Ihnen kompilierte Code aus? Wie haben Sie disassembliert? ildasm? Was haben Sie erwartet zu finden, aber nicht gefunden?