2016-01-18 2 views
0

Я случайно нашел своеобразное поведение, для которого у меня нет причин. В приведенной ниже программе есть 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

Я не вижу, как два раздела соотносятся друг с другом. Этот вопрос не представлен очень хорошо. –

+0

Да, разделы не коррелированы, я просто добавлял некоторый код отсюда и там по потоку и проверял, как работает код, но факт в том, что над 2 потоками выполняются их задачи, то почему они влияют на время, прошедшее. –

+1

О, я вижу, вы говорите, если вы включите их, то потребуется дополнительное время. Я бы предположил, что потоки не бесплатны. Требуется время, чтобы выделить поток из пула, назначить рабочую функцию, а затем запустить поток - в этот момент ОС берет верх и выделяет поток в CPU. Существуют различные фоновые действия, такие как ожидание фрагментов времени и потенциальных переключателей контекста. Эти данные абстрагируются от вашего взгляда на мир потока. –

ответ

3

Вы не хватая полную картину. Ваше профилирование приводит вас к неверному истолкованию.

При запуске потока вы запрашиваете операционную систему для запуска потока, что не означает, что он начинается сразу, это всего лишь запрос. ОС решает, когда он запускает ваш поток и как долго. При этом в вашем примере ваши потоки в разделе комментариев могут быть запущены до, во время или даже после второго раздела.

Работа в ваших потоках также немного сомнительна. Счетчик десяти очень минималистичен. Также имейте в виду, что то, что вы делаете, записывая на консоль из потока, возможно только потому, что класс Console выполняет синхронизацию потоков для вас. Итак, как это соответствует срокам? Понятия не имею.

Тогда могут быть другие процессы с другими потоками, которые вы не знаете.

И, кроме всего прочего, у вас, вероятно, есть многоядерный процессор, который может или не повлияет на все.

Профилирование - непростая задача. Вы должны, по крайней мере, повторять свои тесты несколько раз, сопоставлять результаты и иметь четкое представление обо всем.

+0

Есть несколько вещей, которые я получаю в ответ от вашего ответа: ОС решает, когда работает поток, но когда я вижу, что их задача печати выполнена , Я предполагаю, что поток выполняется с заданием. для счетчика 10 Только я целеустремленно установил его, чтобы конец резьбы. Я получаю тот факт, что могут быть некоторые другие процессы, которые могут потреблять процессоры. –

+0

Принял это с комментариями Адама, спасибо Jef и Adam –

Смежные вопросы