TLDR;En cuanto al rendimiento Any
parece ser más lenta (si ha configurado adecuadamente para evaluar tanto los valores en casi simultáneamente) lista
var list1 = Generate(1000000);
var forceListEval = list1.SingleOrDefault(o => o == "");
if (forceListEval != "sdsdf")
{
var s = string.Empty;
var start2 = DateTime.Now;
if (!list1.Exists(o => o == ""))
{
var end2 = DateTime.Now;
s += " Exists: " + end2.Subtract(start2);
}
var start1 = DateTime.Now;
if (!list1.Any(o => o == ""))
{
var end1 = DateTime.Now;
s +=" Any: " +end1.Subtract(start1);
}
if (!s.Contains("sdfsd"))
{
}
prueba del generador:
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;
}
Con registros 10M
"Any: 00: 00: 00,3770377 existe: 00: 00: 00,2490249"
Con 5M registra
"Any: 00: 00: 00,0940094 existe: 00: 00: 00,1420142"
Con registros 1M
"Any: 00:00 : 00.0180018 Existe: 00: 00: 00.0090009 "
Con 500k, (también volteé orden en el que se evalúan para ver si no hay ninguna operación adicional asociado con lo que se ejecuta en primer lugar)
"existe: 00: 00: 00,0050005 Cualquier: 00: 00: 00,0100010".
Con 100k registros
"existe: 00: 00: 00,0010001 Cualquier: 00: 00: 00,0020002"
parecería Any
t O sea más lento por la magnitud de 2.
Editar: Para 5 y registros 10M He cambiado la forma en que se genera la lista y Exists
de repente se hizo más lento que Any
lo que implica que hay algo malo en la forma en que estoy probando.
nuevo mecanismo de prueba:
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 == "");
if (forceListEval != "sdsdf")
{
var s = string.Empty;
var start1 = DateTime.Now;
if (!list1.Any(o => o == ""))
{
var end1 = DateTime.Now;
s += " Any: " + end1.Subtract(start1);
}
var start2 = DateTime.Now;
if (!list1.Exists(o => o == ""))
{
var end2 = DateTime.Now;
s += " Exists: " + end2.Subtract(start2);
}
if (!s.Contains("sdfsd"))
{
}
}
Edit2: Ok por lo que para eliminar cualquier influencia de la generación de datos de prueba que lo escribí todo en archivo y ahora leer desde allí.
private static void Test()
{
var list1 = File.ReadAllLines("test.txt").Take(500000).ToList();
var forceListEval = list1.SingleOrDefault(o => o == "");
if (forceListEval != "sdsdf")
{
var s = string.Empty;
var start1 = DateTime.Now;
if (!list1.Any(o => o == ""))
{
var end1 = DateTime.Now;
s += " Any: " + end1.Subtract(start1);
}
var start2 = DateTime.Now;
if (!list1.Exists(o => o == ""))
{
var end2 = DateTime.Now;
s += " Exists: " + end2.Subtract(start2);
}
if (!s.Contains("sdfsd"))
{
}
}
}
10M
"Any: 00: 00: 00,1640164 existe: 00:00:00.0750075"
5M
"Any: 00: 00: 00,0810081 existe: 00: 00: 00,0360036"
1M
"Any: 00:00 : 00.0190019 Existe: 00: 00: 00.0070007 "
500k
"Any: 00: 00: 00,0120012 existe: 00: 00: 00,0040004"

miradas ¿Cómo funciona el código como se ha compilado? ¿Cómo desmontaste? ildasm? ¿Qué esperabas encontrar pero no lo hiciste? – Meinersbur