TLDR; Hiệu suất-khôn ngoan Any
dường như chậm hơn (nếu tôi đã thiết lập đúng cách này để đánh giá cả hai giá trị gần như cùng một lúc)
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"))
{
}
kiểm tra danh sách tạo:
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;
}
Với hồ sơ 10 triệu
"Bất kỳ: 00: 00: 00.3770377 Tồn tại: 00: 00: 00.2490249"
Với hồ sơ 5 triệu
"Bất kỳ: 00: 00: 00.0940094 Tồn tại: 00: 00: 00.1420142"
Với hồ sơ 1 triệu
"Bất kỳ: 00: 00: 00.0180018 Tồn tại: 00: 00: 00.0090009"
Với 500k, (tôi cũng đã lật lại thứ tự mà họ được đánh giá để xem liệu không có hoạt động bổ sung nào liên quan đến việc nào chạy trước.)
"Tồn tại: 00: 00: 00.0050005 Bất kỳ: 00: 00: 00.0100010"
Với hồ sơ 100k
"Tồn tại: 00: 00: 00.0010001 Bất kỳ: 00: 00: 00.0020002"
Nó dường như Any
chậm hơn bởi cường độ 2.
Chỉnh sửa: Đối với các bản ghi 5 và 10 triệu, tôi đã thay đổi cách tạo danh sách và Exists
đột nhiên trở nên chậm hơn so với Any
ngụ ý rằng có gì đó không đúng trong cách tôi đang kiểm tra.
Cơ chế thử nghiệm mới:
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"))
{
}
}
Edit2: Ok để loại bỏ mọi ảnh hưởng từ việc tạo dữ liệu thử nghiệm, tôi đã viết tất cả vào tệp và bây giờ đọc nó từ đó.
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"))
{
}
}
}
10 triệu
"Bất kỳ: 00: 00: 00.1640164 Tồn tại: 00: 00: 00.0750075"
5 triệu
"Bất kỳ: 00: 00: 00.0810081 Tồn tại: 00: 00: 00.0360036"
1 triệu
"Bất kỳ: 00: 00: 00.0190019 Tồn tại: 00: 00: 00.0070007"
500k
"Bất kỳ: 00: 00: 00.0120012 Tồn tại: 00: 00: 00.0040004"