Форум   Статьи   Новости   Файлы   Bugtraq   Сниффер   Друзья   О Клубе
  , 08:48   #1
Модератор
 
Локация: Cyberspace
Регистрация: 01.07.2008
Сообщений: 122

Репутация: 75 / 1
Exclamation For vs Parallel for

Одна из интересных фитч .NET 4 параллельный цикл for. Parallel For, который по сути запускает новые потоки, когда есть свободные ресурсы процессора и нет других потоков, которые хотят их использовать. Изначально запускается 5 потоков, и потом они потихоньку растут (по одному в секунду), если есть ресурсы. По умолчанию число потоков не ограничено.
Описывать способы вызова и синтаксис в данной статье я не буду, а просто приведу некоторые сравнения между обычным for и parallel for, которые, надеюсь, Вам пригодятся при решении различных задач.

Я провел 4 эксперимента:
1) упорядоченное заполнение массива из N элементов, по принципу mass[i] = i
2) заполнение массива из N элементов c простейшими математическими расчетами, по принципу mass[i] = Sqrt(i+1)
3) заполнение массива из N элементов c сложными математическими расчетами, по принципу
mass[i] = Exp(Log10(Sqrt(i+1) + Sin(Sqrt(i * PI / 180))));
4) заполнение массива из N элементов c простейшими математическими расчетами и задержкой потока, по принципу mass[i] = Sqrt(i+1);Sleep(1);

Вот простейший код для повторения эксперимента:
C# highlight
using System;
using System.Threading;
using System.Threading.Tasks;

namespace TouplesTest
{
    class Program
    {
        const int cnt = 1000000;

        static void Main(string[] args)
        {
            double[] mass = new double[cnt];
            
            DateTime t1 = DateTime.Now;
            Parallel.For(0, cnt, j => { mass[j] = j; });
            TimeSpan p1 = DateTime.Now - t1;
            Console.Clear();
            DateTime t2 = DateTime.Now;
            for(int i = 0; i < cnt; i ++) mass[i] = i;
            TimeSpan p2 = DateTime.Now - t2;
            Console.Clear();

            DateTime t3 = DateTime.Now;
            Parallel.For(0, cnt, j => { mass[j] = Math.Sqrt(j+1); });
            TimeSpan p3 = DateTime.Now - t1;
            DateTime t4 = DateTime.Now;
            for (int i = 0; i < cnt; i++) mass[i] = Math.Sqrt(i+1);
            TimeSpan p4 = DateTime.Now - t2;

            DateTime t5 = DateTime.Now;
            Parallel.For(0, cnt, j => { mass[j] = Math.Exp(Math.Log10(Math.Sqrt(j + 1) + Math.Sin(Math.Sqrt(j * Math.PI / 180)))); });
            TimeSpan p5 = DateTime.Now - t1;
            DateTime t6 = DateTime.Now;
            for (int i = 0; i < cnt; i++) mass[i] = Math.Exp(Math.Log10(Math.Sqrt(i+1) + Math.Sin(Math.Sqrt(i * Math.PI / 180))));
            TimeSpan p6 = DateTime.Now - t2;

            DateTime t7 = DateTime.Now;
            Parallel.For(0, cnt, j => { mass[j] = Math.Sqrt(j + 1);Thread.Sleep(1); });
            TimeSpan p7 = DateTime.Now - t1;
            DateTime t8 = DateTime.Now;
            for (int i = 0; i < cnt; i++) { mass[i] = Math.Sqrt(i + 1); Thread.Sleep(1); }
            TimeSpan p8 = DateTime.Now - t2;

            Console.WriteLine("Simple actions");
            Console.WriteLine(string.Format("parallel for:{0}  \nfor:{1}", p1.TotalSeconds, p2.TotalSeconds));

            Console.WriteLine("Simple math actions");
            Console.WriteLine(string.Format("parallel for:{0}  \nfor:{1}", p3.TotalSeconds, p4.TotalSeconds));

            Console.WriteLine("Simple math actions with thread sleep 1");
            Console.WriteLine(string.Format("parallel for:{0}  \nfor:{1}", p7.TotalSeconds, p8.TotalSeconds));

            Console.WriteLine("Strong math actions");
            Console.WriteLine(string.Format("parallel for:{0}  \nfor:{1}", p5.TotalSeconds, p6.TotalSeconds));

            Console.ReadLine();
        }

    }
}
По итогам эксперимента мы получили:


В общем, довольно интересная штука, рекомендую попробовать для ваших прикладных задач, особенно если в них есть элемент ожидания, который занимает приличное время. Также можно использовать для сложных вычислений - это даст некоторый выигрыш. И очень аккуратно используйте эту вещь в и так уже многопоточных приложениях, потому что поведение может сильно отличаться от ожидаемого. Да, и последнее замечание - вся внутренняя реализация должна быть потокобезопасной.
Изображения
Тип файла: jpg test2.jpg (41.9 Кб, 2 загрузок)
__________________
Live long and prosper.
Пользователь вне форума    
Наши Спонсоры
 

Метки
for, parallel for

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Gentoo Lady_ann Linux 5 12.04.2011 18:51
Раздача ключей для нод 32 zloderator Раздачи 1 06.03.2011 16:45
[Обзор] В луших традициях UNIX Irenica Linux 3 15.07.2010 23:14
Защита и описание портов Samikolo Уязвимости и защита 3 11.01.2010 21:32



Часовой пояс GMT +2
Powered by vBulletin® 3.x.x Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Copyright © 2008 - 2013 «HPC» Реклама на сайте Правила Форума Пользовательское соглашение Работа на сайте
При копировании материалов ставьте ссылку на источник
Все материалы представлены только в ознакомительных целях, администрация за их использование ответственности не несет.