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;
}
10 এম রেকর্ড সহ
"যে কোনও: 00: 00: 00.3770377 বিদ্যমান: 00: 00: 00.2490249"
5M রেকর্ড সহ
"যে কোনও: 00: 00: 00.0940094 বিদ্যমান: 00: 00: 00.1420142"
1 এম রেকর্ড সহ
"যে কোনও: 00: 00: 00.0180018 বিদ্যমান: 00: 00: 00.0090009"
৫০০ কে দিয়ে, (প্রথমে কোনটিই চালিত হয় তার সাথে যুক্ত কোনও অতিরিক্ত ক্রিয়াকলাপ নেই কিনা তা দেখার জন্য তারা মূল্যায়ন করে যাতে ক্রম ঘুরে দেখলাম pped)
"বিদ্যমান: 00: 00: 00.0050005 যে কোনও: 00: 00: 00.0100010"
100k রেকর্ড সহ
"বিদ্যমান: 00: 00: 00.0010001 যে কোনও: 00: 00: 00.0020002"
এটি Any
2 এর परिमाणের দ্বারা ধীর হয়ে যাবে বলে মনে হচ্ছে ।
সম্পাদনা করুন: 5 এবং 10 এম রেকর্ডের জন্য আমি তালিকাটি তৈরি করার পদ্ধতিটি পরিবর্তন করেছি এবং 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"
1 মি
"যে কোনও: 00: 00: 00.0190019 বিদ্যমান: 00: 00: 00.0070007"
500K
"যে কোনও: 00: 00: 00.0120012 বিদ্যমান: 00: 00: 00.0040004"