私は突然linqの性能について不思議になり、何らかのテストを実行しました。linqが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の間でした。
これは大きな違いです。
これは、キーがIdと等しくなくても削除された変数をチェックするので、checkidメソッドは対応するキーを見つけたときにのみ削除された変数をチェックするためですか?
linqは辞書のハッシュテーブルを使用していないためです。基本的にはo(1)ではなくo(n) –