TLDR; ประสิทธิภาพที่ชาญฉลาดAny
ดูเหมือนจะช้าลง (ถ้าฉันตั้งค่านี้อย่างถูกต้องเพื่อประเมินค่าทั้งสองในเวลาเดียวกัน)
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"))
{
}
เครื่องกำเนิดรายการทดสอบ:
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;
}
ด้วยบันทึก 10M
"ใด ๆ : 00: 00: 00.3770377 มีอยู่: 00: 00: 00.2490249"
ด้วยบันทึก 5M
"ใด ๆ : 00: 00: 00.0940094 มีอยู่: 00: 00: 00.1420142"
ด้วย 1M บันทึก
"ใด ๆ : 00: 00: 00.0180018 มีอยู่: 00: 00: 00.0090009"
ด้วย 500k (ฉันพลิกไปตามลำดับที่พวกเขาได้รับการประเมินเพื่อดูว่าไม่มีการดำเนินการเพิ่มเติมใด ๆ ที่เกี่ยวข้องกับสิ่งที่ทำงานก่อนหรือไม่)
"มีอยู่: 00: 00: 00.0050005 อะไรก็ได้: 00: 00: 00.0100010"
ด้วยการบันทึก 100k
"มีอยู่: 00: 00: 00.0010001 อะไรก็ได้: 00: 00: 00.0020002"
ดูเหมือนว่าAny
จะช้าลงด้วยขนาด 2
แก้ไข:สำหรับ 5 และ 10M บันทึกฉันเปลี่ยนวิธีที่มันสร้างรายการและExists
ก็ช้ากว่าAny
ที่แสดงถึงมีบางอย่างผิดปกติในวิธีที่ฉันกำลังทดสอบ
กลไกการทดสอบใหม่:
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"))
{
}
}
แก้ไข 2:ตกลงเพื่อกำจัดอิทธิพลใด ๆ จากการสร้างข้อมูลทดสอบฉันเขียนมันทั้งหมดไปยังไฟล์และตอนนี้อ่านจากที่นั่น
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
"ใด ๆ : 00: 00: 00.1640164 มีอยู่: 00: 00: 00.0750075"
5M
"ใด ๆ : 00: 00: 00.0810081 มีอยู่: 00: 00: 00.0360036"
1M
"ใด ๆ : 00: 00: 00.0190019 มีอยู่: 00: 00: 00.0070007"
500k
"Any: 00: 00: 00.0120012 มีอยู่: 00: 00: 00.0040004"