none
請教下平行處理問題 RRS feed

  • 問題

  • 小弟最近對這個技術滿感興趣的 所以就上網找幾個範例來玩玩看

    從下面這篇文章 小弟看到多核的威力

    http://blog.darkthread.net/post-2010-01-22-multicore-3.aspx

    所以參考內文文章的代碼 打算初展身手 

    以下是我改成VB的code

     Private Shared Sub Main()
            Dim MAX_COUNT As Integer = 5000 * 10000
            Dim sw As New Stopwatch()
            For round As Integer = 0 To 2
    
                sw.Reset()
                sw.Start()
                Parallel.[For](0, MAX_COUNT, Function(j)
                                                 Dim d As Double = Math.Log10(Convert.ToDouble(j))
                                                 ' If j Mod 5000 = 0 Then Thread.Sleep(10)
    
                                             End Function)
                sw.[Stop]()
                Console.WriteLine("Parallel.For = {0:N0}ms", sw.ElapsedMilliseconds)
            Next
            Console.Read()
        End Sub


    內文講述到

    每5000次delay 10ms 這樣比原本沒加這行時  速度可以變較快  那我加了這行跟沒加都各自測試了一番

    未加測試:

    Parallel.For = 2,251ms
    Parallel.For = 1,931ms
    Parallel.For = 2,516ms

    加了之後再測試:

    Parallel.For = 11,556ms
    Parallel.For = 9,652ms
    Parallel.For = 8,423ms

    看到結果後 挺殘念的....

    怎麼變更慢阿 這是怎麼回事???

    小弟的電腦CPU i7的 我想詐乾它...

    • 已編輯 向恩 2013年9月27日 上午 01:08
    2013年9月27日 上午 01:06

解答

所有回覆

  • 如果你用Paralle.For,除非是計算大批量的循環數據,否則每一個都會創建一個新線程在後臺處理,而創建線程本身就需要時間。

    如果你純粹計算一個循環,建議還是用Task或者是IsBackGround設置為True的Thread來的划算。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年9月27日 上午 01:13
  • 你是單純轉譯那篇文章,還是有把所有參考內容看完?

    理直氣和,切記。

    Blog: http://blog.kkbruce.net

    Book:《ASP.NET MVC 4 網站開發美學

    2013年9月27日 上午 01:51
  • 你是單純轉譯那篇文章,還是有把所有參考內容看完?

    理直氣和,切記。

    Blog: http://blog.kkbruce.net

    Book:《ASP.NET MVC 4 網站開發美學

    我把該篇的內文看完 內文講到說 Paralle.For強調的是動態調節 由一條Thread開始 再逐步增加

    之後它改成用下面這一行 

    If j Mod 5000 = 0 Then Thread.Sleep(10)

     來定義  Paralle.For使用兩個Thread 而不是動態調節的 以這樣先幫它預先定義好兩條Thread 

    這樣處理速度比較快 我是這樣理解的 它這樣實測出來的速度有變快

    但我這邊實測的效果卻不如文章所講述的效果


    • 已編輯 向恩 2013年9月27日 上午 02:14
    2013年9月27日 上午 02:12
  • 但是看這位作者的內文寫出來的代碼 跟他測試的結果 速度的確有拉上來 

    我現在是搞不懂相同的運算  為什麼我這邊的測試結果 速度卻沒拉上來

    2013年9月27日 上午 03:16
  • 原因在於它強制每個線程必須按照先後順序完成,請註釋這兩句話你測試一下就效果完全不同:

                    //for (int i = 0; i < WORKER_COUNT; i++)
                    //    workers[i].Join();


    Click For donating:Free Rice For the pool

    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue.

    2013年9月28日 上午 06:19
  • Multi-Thread[2] = 42ms
    Parallel.For = 6,174ms
    Multi-Thread[2] = 28ms
    Parallel.For = 6,409ms
    Multi-Thread[2] = 29ms
    Parallel.For = 5,131ms
    Multi-Thread[2] = 34ms
    Parallel.For = 6,787ms
    Multi-Thread[2] = 29ms
    Parallel.For = 5,743ms
    Multi-Thread[2] = 30ms
    Parallel.For = 7,033ms

    這兩句註釋 用thread的方式 效率是變好了

    但是我現在搞不清楚為什麼是Parallel.For 的速度還是提不上來..


    • 已編輯 向恩 2013年9月28日 上午 08:52
    2013年9月28日 上午 08:21
  • Paralle的For是根据每一个循环都创建一个线程,创建线程本身就需要时间。执行少任务的完全不合算。

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年9月28日 上午 08:47
  • 所以意思是如果要好好善用多核心的指令來提升程式的速度 用Parallel.For 是比較不好的 

    應該用Thread 去創建線程是這樣嗎?

    Parallel.For 的使用時機是什麼情況較適合呢?

    執行少任務不合算 那要到多大的任務才適合 可以舉個例子嗎?
    • 已編輯 向恩 2013年9月28日 下午 03:01
    2013年9月28日 下午 01:01
  • 您好,
    設計一個應用程式不容易,設計一個並行的應用程式更是不容易。
    一樣都是Parallel.For ,但多加入了 Thread.Sleep(10),一定會比較慢的!
    而您說測試出來的為何不是像黑大說的時間,那是因為他有一句是說「把執行次數改為100萬次縮短總執行時間」。
    所以請您將MAX_COUNT改成10 * 10000;

    不過,我想2個會有差,應該是因為使用了Join,所以會影響到!備

    您可以參考官方的相關資料,如下,

    http://msdn.microsoft.com/en-US/vstudio/bb964701

    http://msdn.microsoft.com/en-us/library/dd460693.aspx

    http://msdn.microsoft.com/en-us/library/ff963553.aspx


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2013年9月29日 上午 02:39
  • 參考這個例子:http://www.cnblogs.com/Henllyee/archive/2010/05/01/ParallelProgaramming1.html

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年9月29日 上午 02:44
  • 我現在把代碼改成下面這樣

        Dim st1, ed1 As Integer
        Private Sub Main()
            'Dim MAX_COUNT As Integer = 5000 * 10000
            Dim MAX_COUNT As Integer = 100 * 10000
            Dim sw As New Stopwatch()
            For round As Integer = 0 To 2
                sw.Reset()
                sw.Start()
                Dim WORKER_COUNT As Integer = 2
                Dim workers As Thread() = New Thread(WORKER_COUNT - 1) {}
                Dim jobsCountPerWorker As Integer = MAX_COUNT \ WORKER_COUNT
                For i As Integer = 0 To WORKER_COUNT - 1
                    Dim st As Integer = jobsCountPerWorker * i : st1 = st
                    Dim ed As Integer = jobsCountPerWorker * (i + 1) : ed1 = ed
                    If ed > MAX_COUNT Then
                        ed = MAX_COUNT
                    End If
                    workers(i) = New Thread(AddressOf Me.s)
                    workers(i).Start()
                Next
                'For i As Integer = 0 To WORKER_COUNT - 1
                '    workers(i).Join()
                'Next
                sw.[Stop]()
                Console.WriteLine("Multi-Thread[{1}] = {0:N0}ms", sw.ElapsedMilliseconds, WORKER_COUNT)
    
                sw.Reset()
                sw.Start()
    
                Parallel.For(0, MAX_COUNT, Function(j)
                                               Dim d As Double = Math.Log10(Convert.ToDouble(j))
                                               'If j Mod 5000 = 0 Then Thread.Sleep(10)
    
                                           End Function)
                sw.[Stop]()
                Console.WriteLine("Parallel.For = {0:N0}ms", sw.ElapsedMilliseconds)
            Next
            Console.Read()
        End Sub
    MAX_COUNT 不管改成多少次  Parallel.For 速度執行上還是比較慢  ...
    2013年10月6日 下午 12:09
  • 要玩 Paraller Task Library 之前. 要對 Thread 及 ThreadPool 有深入的理解.

    然後把   工作平行程式庫 (TPL) 所有相關的文件搞懂.

    沒有一蹴可幾就可以搞懂的. 


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 <br/> <a target="_blank" href="http://www.bplan.com.tw/chunfeng/front/bin/ptlist.phtml?Category=103591"><img border="0" src="http://files.dotblogs.com.tw/billchung/1007/20107414497912.gif" width="200" height="67"></a>

    2013年10月6日 下午 03:36
    版主
  • 也可以參考煥麟老師整理的多執行緒筆記,請參考:

    1. http://huan-lin.blogspot.com/2013/04/csharp-notes-multithreading-1.html
    2. http://huan-lin.blogspot.com/2013/05/csharp-notes-multithreading-2.html
    3. http://huan-lin.blogspot.com/2013/05/csharp-notes-multithreading-3-priority.html
    4. http://huan-lin.blogspot.com/2013/06/csharp-notes-multithreading-4-thread.html
    5. http://huan-lin.blogspot.com/2013/06/csharp-notes-multithreading-5.html
    6. http://huan-lin.blogspot.com/2013/06/csharp-notes-multithreading-6-tpl.html

    建議按照順序來看...


    授人以魚,三餐之需;授人以漁,終生之用。
    希望各位發問的朋友,得到的是如何釣魚的知識。之後也可以分享給別人,釣魚的知識。而不是肚子餓了,就上來討魚吃。

    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:


    小弟的blog: In 91,wiki: my wiki

    2013年10月7日 上午 04:46