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"))
{
}
}
Edit2: ठीक है इसलिए परीक्षण डेटा उत्पन्न करने से किसी भी प्रभाव को खत्म करने के लिए मैंने इसे फाइल करने के लिए लिखा है और अब इसे वहां से पढ़ें।
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
"कोई भी: 00: 00: 00.0120012 अस्तित्व: 00: 00: 00.0040004"