Я случайно нашел своеобразное поведение, для которого у меня нет причин. В приведенной ниже программе есть 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();
}
}
Я не вижу, как два раздела соотносятся друг с другом. Этот вопрос не представлен очень хорошо. –
Да, разделы не коррелированы, я просто добавлял некоторый код отсюда и там по потоку и проверял, как работает код, но факт в том, что над 2 потоками выполняются их задачи, то почему они влияют на время, прошедшее. –
О, я вижу, вы говорите, если вы включите их, то потребуется дополнительное время. Я бы предположил, что потоки не бесплатны. Требуется время, чтобы выделить поток из пула, назначить рабочую функцию, а затем запустить поток - в этот момент ОС берет верх и выделяет поток в CPU. Существуют различные фоновые действия, такие как ожидание фрагментов времени и потенциальных переключателей контекста. Эти данные абстрагируются от вашего взгляда на мир потока. –