一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

Silverlight 的多線程能力(下)

  上一期筆者介紹了Silverlight實(shí)現(xiàn)多線程的諸多解決方案,本期筆者將通過一個實(shí)例來實(shí)現(xiàn)所有多線程編程方法,并且還將于JavaScript和Flash兩種Web客戶端技術(shù)性能進(jìn)行比較,請勿拍磚。

  在正式編程前,筆者還要重申上期非常重要的觀點(diǎn):Silverlight多線程主要作用不是在于提高性能,而是在于用戶體驗(yàn)。這里要給多線程潑一盆冷水了,多線程與性能提升不是正比關(guān)系,如果你使用一個單核CPU的客戶端設(shè)備,那么即便你創(chuàng)建100個多線程也與單線程的計(jì)算性能是一樣的,因?yàn)橐粋€CPU時(shí)間片下只能處理一個線程,多線程也必須串行處理,甚至還可能因?yàn)檫^多的CPU調(diào)度開銷而導(dǎo)致性能不及單線程的情況。當(dāng)然在多核的情況下多線程可以負(fù)載到多個CPU上并行執(zhí)行而提升性能,經(jīng)過筆者在項(xiàng)目實(shí)施前的技術(shù)研究中發(fā)現(xiàn)如果客戶端有N核的情況下,Silverlight多線程可以被N個CPU時(shí)間片平分,而CLR將同時(shí)讓N+1個線程處于Ready狀態(tài),經(jīng)過反復(fù)測試多線程性能是單線程的近N倍。其實(shí)客戶端已經(jīng)呈現(xiàn)多核趨勢,就在不久前發(fā)布了PSP的下一代產(chǎn)品NGP采用ARM 4核處理器,而iPad2采用A5雙核處理器,而我們現(xiàn)在用的筆記本與臺式機(jī)基本都是超過2核的處理器,所以多線程的計(jì)算能力還是很有前景的。

  下面我們就一起來看看實(shí)例,這個實(shí)例筆者選擇了比較容易懂的素?cái)?shù)計(jì)數(shù)函數(shù)(Prime-counting function)作為實(shí)例,用數(shù)學(xué)專業(yè)術(shù)語來說就是π(x),有沒有搞錯怎么和圓周率有關(guān)?這里不是圓周率而是π函數(shù),是一個用來表示小于或等于某個實(shí)數(shù)x的素?cái)?shù)的個數(shù)的函數(shù)。比如π(10)=4,因?yàn)椴淮笥?0的素?cái)?shù)有2,3,5,7共計(jì)4個。對于π(x)的確定性算法筆者準(zhǔn)備了兩種:

  1. 試除法
  2. 具體方法是從3開始對所有不大于x的奇數(shù)進(jìn)行素?cái)?shù)判斷。當(dāng)判斷i是否為素?cái)?shù)時(shí),通過從3開始到i的平方根(i=m*n中必然有一個因子小于i的平方根)的所有奇數(shù)進(jìn)行試除,如果i能被整除則i不是素?cái)?shù),否則i是素?cái)?shù)。該算法最易理解,而且可以并行試除,并行試除法的思路是按照2k*m+n的同余類進(jìn)行分組,如果有k個并行組,那么對于從3開始對所有不大于x的奇數(shù)可以用{2k*m+1,2k*m+3,…,2k*m+2k-1}共k個同余組來分別進(jìn)行試除,最后π(x)等于所有分組素?cái)?shù)求和。

  3. 埃拉托斯特尼篩法
  4. 埃拉托斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由古希臘數(shù)學(xué)家埃拉托斯特尼所提出的一種簡單檢定素?cái)?shù)的算法,該算法的思路從第一個素?cái)?shù)開始,按照素?cái)?shù)的倍數(shù)都是合數(shù)的思路,全部篩去,然后再篩去第二個素?cái)?shù)的倍數(shù),一直到當(dāng)前素?cái)?shù)大于x的平方根時(shí)結(jié)束,所得到?jīng)]有篩去的數(shù)都是素?cái)?shù)。該算法是已知確定性算法中時(shí)間復(fù)雜度最低的算法,但缺點(diǎn)是不能并行(至少筆者目前還沒有找到并行篩法,如果你找到了請與筆者聯(lián)系)。

  在本案例中筆者使用試除法進(jìn)行多線程計(jì)算,并通過篩法來校驗(yàn)計(jì)算的正確性。下面我們首先實(shí)現(xiàn)Silverlight的兩個算法類:

  1. 試除類PrimeFinder
  2. 該類主要負(fù)責(zé)對并行算法的支持,其中MaxPrime屬性用來記錄最大素?cái)?shù),PrimeCount屬性記錄素?cái)?shù)個數(shù),Stat屬性的類型為枚舉類WorkerStat { Init, Working, Worked },用以監(jiān)視線程的工作狀態(tài)。OnFindComplete事件用于通知UI線程查找完成。其中主要函數(shù)實(shí)現(xiàn)如下:

    publicvoid FindPrime() 
    {
      _primeCount
    = 0;
      _stat
    = WorkerStat.Working;

    for (uint i = _startNum; i <= _maxNam; i += _step)
    {
      if (IsPrime(i))
      {
        _primeCount
    ++;
        _maxPrime
    = i;
      }
    }
      _stat
    = WorkerStat.Worked;

      //通知完成查找
      InvokeFindComplete(EventArgs.Empty);
    }

    privatebool IsPrime(
    uint x)
    {
      if (x == 1u) returnfalse;
      uint sqrtx = (uint)(Math.Sqrt(x));
      for (uint i = 3u; i <= sqrtx; i += 2u)
      {
        if (x % i == 0) returnfalse;
      }
      return true;
    }

    NET技術(shù)Silverlight 的多線程能力(下),轉(zhuǎn)載需保留來源!

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 一区二区三区不卡在线观看 | 亚洲精品第四页中文字幕 | 亚洲精品tv久久久久久久久久 | 久草热视频在线 | 国产成人精品免费视频大全可播放的 | 怡红院在线视频精品观看 | 六月婷婷开开放处 | 亚洲成人国产精品 | 午夜激情免费视频 | 91麻豆精品国产片在线观看 | 久久婷婷国产精品香蕉 | 激性欧美激情在线播放16页 | 免费看的www视频网站视频 | 精品小视频在线观看 | 国产精品亚洲欧美日韩久久 | 国产一区高清 | 97人人爱| 亚洲合集综合久久性色 | 91久久精品 | 日本红怡院在线 | 中文字幕无线码中文字幕免费 | 欧美一级一一特黄 | 粉嫩粉嫩毛片视频 | 国产91在线播放 | 色视频国产 | 国产亚洲精品福利在线 | 91华人在线视频 | 亚洲国产成人在线 | 欧美色欧美亚洲高清在线观看 | 依人九九| 欧美大片欧美激情免费看一 | 成人免费视频网站 | 亚洲伊人久久大香线蕉结合 | 老太婆性杂交欧美肥老太 | 91精品啪国产在线观看免费牛牛 | 四虎国产精品免费久久久 | 国产一区二区网站 | 青青热在线精品视频免费 | 99国内视频| 午夜在线免费观看视频 | 亚洲深夜视频 |