Мне неожиданно стало интересно узнать о производительности linq и провело некоторое тестирование.Почему linq slow in C#
Ниже мой тестовый код, и результат был довольно неожиданным.
Может ли кто-нибудь работать с linq и почему медленнее TryOut?
Public class TestObject
{
....
....
//this class contain many members
bool deleted;
....
}
class Program
{
public static ConcurrentDictionary<string, TestObject> testDictionary = new ConcurrentDictionary<string, TestObject>();
static void Main(string[] args)
{
//testDictionary is initialized in ohter code and is likely to have 10000 elements.
RandomTest(0);
RandomTest(1);
Console.ReadKey();
}
static void RandomTest(int k)
{
int count = 10000;
List<string> randomId = new List<string>();
Random rnd = new Random();
for (int i = 0; i < count; i++)
{
int randomNumber = rnd.Next(0, testDictionary.Count());
randomId.Add(testDictionary.ElementAt(randomNumber).key);
}
Stopwatch sw = new Stopwatch();
sw.Start();
if (k == 0)
{
for (int i = 0; i < count; i++)
{
var res = checkid(randomId[i]);
}
}
else if (k == 1)
{
for (int i = 0; i < count; i++)
{
var res = checkid2(randomId[i]);
}
}
sw.Stop();
Console.WriteLine("Elapsed time : " + sw.Elapsed);
}
static bool checkid(string id)
{
TestObject t;
return !testDictionary.TryGetValue(id, out t) ?
false : t.deleted ?
false : true;
}
static bool checkid2(string id)
{
return testDictionary.Any(t => t.key == id && !t.Value.deleted)? true : false;
}
Я побежал эти 2 метода 10000 раз и результат показывает, как показано ниже
Для checkid метода, в основном заняло меньше, чем 00: 00: 00.002.
Для метода checkid2 он в основном принимается между 00: 00: 02.2 и 00: 00: 02.4.
Это огромная разница.
Это потому, что checkid2 метод проверяет удаляемую переменную, даже если ключ не равен Id, в то время как проверка метода проверяет удаляемую переменную только тогда, когда она обнаружила соответствующий ключ?
Поскольку linq не использует хэш-таблицу словаря. Его в основном o (n), а не o (1) –