拡張機能VSFileNavを更新して、VS2012で動作するようにし、いくつかの改善を加えようとしています。Visual Studio ソリューション内のすべてのファイルを一覧表示することになっていますが、これを拡張してメソッド/シンボルも一覧表示したいと考えています。
私はこれを以前に試しましたが、問題の根底に到達することはありませんでした。私が見つけたのはSolution->Projects->Project Items
、メインスレッドで列挙するとかなり速いですが、何らかの種類のスレッドを使用しようとすると、処理が遅くなるということです。まだ再実装していない以前の試みからシンボル検索に時間がかかることは知っていますが、例として、すべてのProjectItem
ファイル名を見つけようとする場合:
ProcessMainThread にかかった時間: 7 ミリ秒
ProcessBackgroundThreadPool にかかった時間: 6661 ミリ秒
ProcessCustomThread にかかった時間: 6750 ミリ秒
これを実行するための私のコードのスニペットProjectItems
。
public void TimeProcess()
{
Stopwatch sw = Stopwatch.StartNew();
ProcessMainThread();
sw.Stop();
Debug.WriteLine("ProcessMainThread took : " + sw.ElapsedMilliseconds + " ms");
ProcessBackgroundThreadPool();
ProcessCustomThread();
}
public void ProcessMainThread()
{
Process();
}
public void ProcessBackgroundThreadPool()
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback((o) =>
{
Stopwatch sw = Stopwatch.StartNew();
Process();
sw.Stop();
Debug.WriteLine("ProcessBackgroundThreadPool took : " + sw.ElapsedMilliseconds + " ms");
}));
}
public void ProcessCustomThread()
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(() =>
{
Stopwatch sw = Stopwatch.StartNew();
Process();
sw.Stop();
Debug.WriteLine("ProcessCustomThread took : " + sw.ElapsedMilliseconds + " ms");
}));
t.Start();
}
だから私の質問は、一体なぜスレッドでほぼ 1000 倍の時間がかかるのですか? また、実行が遅くならないノンブロッキング関数を作成するにはどうすればよいでしょうか? -ファイル内のシンボルの列挙を開始すると、7msよりもはるかに長くなることに注意してください。そうでなければ、あまり気にしません...