反正知道线程是否已释放CPU?

时间:2016-01-18 08:29:54

标签: c# multithreading

我偶然发现了一种奇怪的行为,我没有任何理由。在下面的程序中有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(); 
    }
}

1 个答案:

答案 0 :(得分:3)

你并没有抓住完整的画面。您的分析会导致您误解。

当你启动一个线程时,你要求操作系统启动一个线程,这并不意味着它立即启动,它只是一个请求。操作系统决定何时运行您的线程以及运行多长时间。话虽如此,在你的例子中,评论部分中的线程可以在第二部分之前,期间甚至之后运行。

线程中的工作也有点可疑。对十的反击非常简约。还要记住,只有Console类可以为您执行线程同步,才能从线程写入控制台。那么,这如何适应时机?我不知道。

然后可能还有其他进程正在运行您不知道的其他线程。

除此之外,你可能还有一个多核处理器,可能会也可能不会影响所有内容。

分析不是一件容易的事。您至少应该多次重复测试,对结果进行核心分析,并对所涉及的所有内容有充分的了解。