成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WinRT開發的功能和效率

開發 后端
WinRT開發有著多種選擇性,就編程語言這一點就表現的很突出;這里就這一點 深入展開,探討在WinRT開發之初如何依據各 個編程語言的特性、功能和效率來對 產品的技術方向做出選擇。

這里我選擇運行計算復雜度較高的算法作為測試方法,雖然不能代表全部,但 是很大程度上展示大家平時開發過程中所面臨的常見場景 和問題。考慮到演示和 理解,就選擇了查找100000以內的所有素數的個數的算法作為演示。另外也順帶演 示如何在WinRT下實現多編程語言和技 術之間的協作吧。

關于基本知識和算法吧詳細的說明,請自行搜索各大引擎吧(關鍵 詞:prime、素數),這里我就列舉在各個語言下我的簡單實現吧,其中包括使用 普通算法和并 行計算的兩個版本。

***部分,從目前.NET主流來看吧,以C# 為例,普通版本,這個沒什么多說的,就是從前往后看某個數是不是素數:

  1. private static int 
  2. CountingInternal(int n) 
  3.      var numprimes = 1; 
  4.      for (var i = 3; i <= n; i += 2) 
  5.      { 
  6.          var isPrime = true
  7.          var limit = Math.Ceiling(Math.Sqrt(i)) + 1; 
  8.          for (var j = 3; j < limit; j += 2) 
  9.          { 
  10.              if (i%j == 0) 
  11.              { 
  12.                  isPrime = false
  13.                  break
  14.              } 
  15.          } 
  16.          if (isPrime) 
  17.          { 
  18.              numprimes++; 
  19.          } 
  20.      } 
  21.      return numprimes; 

并行版本稍微復雜一點點,選擇Parallel.For來并行執行一個從1至n/2的并行 循環(我這里偷懶了一下,沒有處理奇 偶數的情況,因為我的調用時傳入的都是 偶數),發現是素數,使用Interlocked輔助方法給計數增加1。

  1. private static int 
  2. CountingParallel(int n) 
  3.      var numprimes = 1; 
  4.      Parallel.For(1, n/2, i => 
  5.      { 
  6.          if (IsPrime(i*2 + 1)) 
  7.          { 
  8.               Interlocked.Increment(ref numprimes); 
  9.          } 
  10.      }); 
  11.      return numprimes; 
  12.   
  13. public static bool IsPrime(int n) 
  14.      if (n%2 == 0) 
  15.          return false
  16.      var limit = (int) (Math.Ceiling(Math.Sqrt(n)) + 1); 
  17.      for (var i = 3; i < limit; i += 2) 
  18.      { 
  19.          if (n%i == 0) 
  20.          { 
  21.              return false
  22.          } 
  23.      } 
  24.      return true

***種場景,直接嵌入算法到C# WinRT App工程,執行結果如下(單位毫 秒):

執行次數 1(啟動) 2 3 4 5
普通 14.0299 9.0005 9.1825 8.0021 11.0181
并行 6.0008 2.0004 2.9993 2.0014 3.999

第二種場景,將C#算法包裝在一個類庫里(注意 是CLR類庫,只能在C#/VB直接通用),在C# WinRT App工程中調用這個類庫,執行 結果如下(單位毫秒):

執行次數 1(啟動) 2 3 4 5
普通 12.0299 9.0019 10.003 9.0014 9.00017
并行 6.0008 2 3.0003 2.9997 1.9995

第三種場景,將C#算法包裝到一個Windows Runtime Component(WRC)中,在C# WinRT App工程中調用這個WRC類庫,執行結 果如下(單位毫秒):

執行次數  1(啟動)  2 3 4
普通  11.9904  9.0032  9  9。0028 9.00149 
并行   6.0008  1.9817  1.9985  1.9993  2

第四種場景,將C#算法包裝到一個Windows Runtime Component(WRC)中,在WinJS App工程中調用這個WRC類庫,執行結果如 下(單位毫秒):

執行次數  1(啟動)  2 3 4
普通  11  9  8  9 8
并行   4  1  1  3  2

小結:以上是從.NET角度來進行的比較,很容易 看出***次CLR加載在這里性能損耗表現的很明顯,完成加載之后性能將穩定在一 定范 圍內波動;另外,并行計算在純算法的應用中有很明顯的性能優勢。

第二部分,接下來我們回歸Native環境,這里我 依然使用普通和并行計算兩種來嘗試,普通的依然沒什么可說的(實際上和C#的沒 區 別,除了關鍵字不一樣)。

  1. static int CountingInternal(int n) 
  2.      auto numprimes = 1; 
  3.      for (auto i = 3; i <= n; i += 2) 
  4.      { 
  5.          auto isPrime = true
  6.          auto limit = ceil(sqrt(i)) + 1; 
  7.   
  8.          for (auto j = 3; j < limit; j += 2) 
  9.          { 
  10.              if (i%j == 0) 
  11.              { 
  12.                  isPrime = false
  13.                  break
  14.              } 
  15.          } 
  16.   
  17.          if (isPrime) 
  18.          { 
  19.              numprimes++; 
  20.          } 
  21.      } 
  22.      return numprimes; 
并行版本,需要注意的是C++ lambda的傳值 和作用域問題,其他的和C#的沒區別:
 
  1. static bool IsPrime(int n) 
  2.      if (n%2 == 0) 
  3.          return false
  4.      auto limit = (int) (ceil(sqrt(n)) + 1); 
  5.      for(auto i=3; i<limit; i+=2) 
  6.      { 
  7.          if(n%i == 0) 
  8.          { 
  9.              return false
  10.          } 
  11.      } 
  12.      return true
  13.   
  14. static int CountingParallel(int n) 
  15.      auto numprimes = 1; 
  16.      parallel_for(1, n/2, [&](int i) 
  17.      { 
  18.          if(IsPrime(i*2+1)) 
  19.          { 
  20.              InterlockedIncrement((volatile unsigned long*)&numprimes); 
  21.          } 
  22.      }); 
  23.      return numprimes; 
***種場景,直接將C++算法放到C++ WinRT App 中使用,執行結果如下(單位毫秒):
執行次數  1(啟動)  2 3 4
普通  8.0019 7.9991  8.0209  8.9843  8.0181 
并行   1.9794  1.998  1.9994  1.984  2.0003

第二種場景,將C++算法包裝在DLL中,在C++ WinRT App中使用,執行結果如下(單位毫秒):

執行次數  1(啟動)  2 3 4
普通  9 9  9  8  9 
并行   3 2  3  2  2

第三種場景,將C++算法包裝在動態連接庫Dll中,在C# WinRT App中通過 PInvoke來調用,執行結果如下(單位毫秒):

執行次數  1(啟動)  2 3 4
普通  9 9  8  9  9 
并行   3 2  3  2  3

第四種場景,將C++算法包裝在靜態鏈接庫Lib中,在C++ WinRT App中調用,執 行結果如下(單位毫秒):

執行次數  1(啟動)  2 3 4
普通  8 8  8  9  9 
并行   2 3  3  2  3

第五種場景,將C++算法包裝在Windows Runtime Component(WRC)中,在C# WinRT App中調用,執行結果如下(單位毫秒):

執行次數  1(啟動)  2 3 4
普通  8.0014 8.0191  8.0293  8.0019  9.0291
并行   1.9994 1.9999  1.998  1.9994  2.99982

第六種場景,將Windows Runtime Component(WRC)中,在WinJS App中調用, 執行結果如下(單位毫秒):

執行次數  1(啟動)  2 3 4
普通  9 8  9  8  8 
并行   2 2  3  2  3

第七種場景是將C++算法包裝在Windows Runtime Library(WRL,基于COM的底 層開發)中,然后在任何一種WinRT App中調用,可以預見這是一種很強大的方 式,但同時也是最費解的一種方式,我成功的包裝了普通算法的COM版,但是嘗試 了很長時間不能成功實現并行運算 的版本,也就放棄在這里展示了,如果你知道 如何在WRL中實現并行計算并返回 IAsyncOperation<T>,請不吝賜教。 

小結:基于C++的實現在適用性、穩定性和執行效率上無可挑剔,如果對于所有 細節(包括***次啟動)的效率考慮,C++是優先 的;如果考慮到C++的復雜度, 如果項目對性能要求可以適當放松但對進度要求很高的時候,選擇CLR會比較容易 控制的;如果原來已有的Web項目 向WinRT遷移,那么前段展示則可以考慮使用 WinJS+HTML來實現,后臺算法根據需要選擇C++或者CLR。

第三部分,如果所有的算法全部運行在 JavaScript中,那么其性能如何呢?這里我先買個關子,留待你自己去探究和發 掘。

總結,WinRT在編程語言的選擇性上有著非常好的 靈活性,在做選擇的時候需要充分考慮自己的要求,比如性能、比如工期、比如經 驗等 等。對于全新項目,在有經驗的情況下,追求***性能的首先首當其沖是 C++,如果考慮到經驗和掌控,可以選擇使用C++做底層,選擇相對容易上手 的 C#/VB或者HTML+JS做界面的方法;如果項目工期要求很緊,或者從老系統遷移,那 么這時候更多的考慮是使用已有資源,直到性能瓶頸的時 候才采取措 施——以C++重寫性能瓶頸來解決,當然,如果沒有C++經驗,也可以考 慮使用C#/VB來 實現WRC以包裝核心邏輯,從而提升運行效率。

附以上測試源代碼和測試工程,點擊這里下載

原文鏈接:http://www.cnblogs.com/powertoolsteam/archive/2013/02/19/2916855.html

責任編輯:彭凡 來源: 博客園
相關推薦

2015-07-20 10:54:47

IOS提高效率工具

2023-08-24 16:43:23

2014-08-28 14:26:14

Cocos Code

2025-02-08 10:02:03

2022-05-26 11:01:24

微軟無代碼工具低代碼工具

2014-06-12 08:53:01

團隊團隊效率

2018-03-14 08:50:31

小程序插件開發

2018-02-24 12:08:52

Python開發技巧

2019-01-28 11:05:41

開發調試ngResourcepostman

2010-03-16 14:02:57

Python運行效率

2025-03-18 09:05:28

2024-04-24 09:29:31

Arc 瀏覽器效率工具Reader

2024-09-06 08:02:52

2025-04-25 07:12:57

2014-03-28 10:30:20

程序員碼農

2015-12-15 09:50:12

Linux開發效率工具

2022-09-05 14:17:48

Javascript技巧

2020-11-25 19:57:15

開發技能代碼

2023-11-22 08:26:03

HutoolJava工具集

2022-04-20 09:02:57

架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 断背山在线观看 | 亚洲福利 | 久久久久亚洲 | 成人毛片视频在线播放 | 国产精品视频yy9299一区 | 欧美网址在线观看 | 日韩影音| 久久久久久九九九九 | 天天干夜夜操 | 国产精品久久久久久久久久久免费看 | 久久精品视频免费观看 | 日韩中文字幕网 | 涩涩视频网站在线观看 | 91精品久久久久久久久久 | 日韩高清一区二区 | 日韩在线不卡 | 麻豆精品国产91久久久久久 | 久久久99国产精品免费 | 九色在线观看 | 精品久久久久久久久久久久久 | 日韩高清电影 | 97精品国产一区二区三区 | 精品国产1区2区3区 一区二区手机在线 | 黄色电影在线免费观看 | 日韩精品二区 | 国产乱码精品一区二区三区中文 | 亚洲精品www | 超碰导航| 国产日韩在线观看一区 | 成人久久久久 | 久久久精品一区二区三区 | 亚洲成av | 中文字幕 国产精品 | 亚洲国产精品一区二区三区 | 精品久久久久久久久久久久久 | 91深夜福利视频 | 91精品国产美女在线观看 | 久久久久国产一区二区三区四区 | 欧美久久久网站 | 婷婷丁香在线视频 | 精品免费视频一区二区 |