我偶然发现了一种奇怪的行为,我没有任何理由。在下面的程序中有2个部分。第一部分是评论,它创建了2个线程,并做了一些工作,在第二部分我添加了一些代码,用于获取质量,我尝试检查AsParallel性能。 AsParallel确实减少了程序的时间。但最令我印象深刻的是,当我评论上述部分时,我的时间得到了改善。 所以我的问题是第一部分,我评论过,让CPU足够忙。或者还有其他原因。
请查看已过去的时间 1)当没有评论第一部分时:经过:4260619(蜱虫) 2)当第一部分被评论时:经过:2700445(蜱)
class Program
{
[ThreadStatic]
static int thStaticInt = 0;
static void Main(string[] args)
{
//new Thread(() =>
//{
// for (int i = 0; i < 10; i++)
// {
// thStaticInt++;
// Console.WriteLine("from first {0}", thStaticInt);
// }
//}
//).Start();
//new Thread(() =>
//{
// for (int i = 0; i < 10; i++)
// {
// thStaticInt++;
// Console.WriteLine("from second {0}", thStaticInt);
// }
//}
//).Start();
//Console.WriteLine("Press any key");
//Console.ReadLine();
//Another section starts here
IEnumerable<int> numbers = Enumerable.Range(3, 1000000);
Stopwatch watch = new Stopwatch();
watch.Start();
var primes = from n in numbers.AsParallel()
where Enumerable.Range(2, (int)Math.Sqrt(n)).All(i => n % i != 0)
select n;
IEnumerable<int> primeNumbers = primes.ToArray();
watch.Stop();
TimeSpan ts = watch.Elapsed;
Console.WriteLine("Time Elapsed {0}", ts.Ticks);
Console.ReadLine();
}
}
答案 0 :(得分:3)
你并没有抓住完整的画面。您的分析会导致您误解。
当你启动一个线程时,你要求操作系统启动一个线程,这并不意味着它立即启动,它只是一个请求。操作系统决定何时运行您的线程以及运行多长时间。话虽如此,在你的例子中,评论部分中的线程可以在第二部分之前,期间甚至之后运行。
线程中的工作也有点可疑。对十的反击非常简约。还要记住,只有Console类可以为您执行线程同步,才能从线程写入控制台。那么,这如何适应时机?我不知道。
然后可能还有其他进程正在运行您不知道的其他线程。
除此之外,你可能还有一个多核处理器,可能会也可能不会影响所有内容。
分析不是一件容易的事。您至少应该多次重复测试,对结果进行核心分析,并对所涉及的所有内容有充分的了解。