日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Apworks框架各種倉儲實現(xiàn)的性能基準(zhǔn)測試

單體測試的設(shè)計

由于Visual Benchmark是基于Visual Studio Unit Test Framework的單體測試用例的,因此,我們只需要在Visual Studio中開發(fā)有待測試的單體測試程序即可。在開發(fā)單體測試程序之前,首先讓我們了解一下Visual Benchmark所支持的“迭代基準(zhǔn)測試”模式。所謂“迭代基準(zhǔn)測試”,意思就是Visual Benchmark會循環(huán)地調(diào)用單體測試方法并在每次調(diào)用結(jié)束時,統(tǒng)計當(dāng)前“代”中所消耗的CPU周期或者時間;當(dāng)Visual Benchmark完成整個測試之后,會將各代的統(tǒng)計結(jié)果組織并顯示出來。在這個過程中,單體測試方法可以通過Visual Benchmark所提供的基準(zhǔn)測試參數(shù)來獲得當(dāng)前所處的“代”數(shù)(也就是循環(huán)因子的值),然后就可以基于這個“代”數(shù)對測試數(shù)據(jù)進行模擬,以反映出隨著測試數(shù)據(jù)的增長,單體測試方法的執(zhí)行效率。

舉例來說,在測試三種不同的倉儲對于聚合的保存執(zhí)行效率時,我首先在Visual Studio中新建了一個Unit Test類,并在類中定義了兩個成員變量:

 
 
 
 
  1. [TestClass]
  2. public class InsertAggregateRootsTest
  3. {
  4.     private int thisIteration;
  5.     private IEnumerable mockSalesOrders;
  6.     // 其它部分暫時省略
  7. }

第一個成員變量thisIteration用來保存從Visual Benchmark傳入的“代”數(shù);而第二個成員變量mockSalesOrders則是保存了一組即將通過倉儲插入的聚合模擬數(shù)據(jù)。

接下來,我在這個測試類中加入了Test Initialize的方法,以便在每次測試方法被調(diào)用前,執(zhí)行一些數(shù)據(jù)初始化的操作。在這個方法中,會對以上兩個成員變量初始化,同時清空后臺數(shù)據(jù)庫,為執(zhí)行測試做準(zhǔn)備。

 
 
 
 
  1. [TestInitialize()]
  2. public void MyTestInitialize()
  3. {
  4.     thisIteration = (int)BenchmarkRuntimeArgs.Instance.ThisIteration;
  5.     mockSalesOrders = Helper.MockSalesOrders(thisIteration);
  6.     Helper.ClearSQLServerTables();
  7.     Helper.ClearMongoDB();
  8. }

在上面的方法中,首先使用BenchmarkRuntimeArgs.Instance.ThisIteration對thisIteration進行初始化,以便獲得當(dāng)前測試的“代”。BenchmarkRuntimeArgs是一個跨應(yīng)用程序域的單件(Singleton),在每次執(zhí)行Benchmark之前都會被初始化。然后根據(jù)獲得的“代”數(shù),創(chuàng)建聚合模擬數(shù)據(jù)。此處mockSalesOrders中所包含的數(shù)據(jù)量會隨著“代”數(shù)的增長而增加,以反映隨著數(shù)據(jù)量的增長,被測函數(shù)的性能趨勢。最后,使用Helper類清空后臺數(shù)據(jù)庫。

由于倉儲的實現(xiàn)是基于不同的應(yīng)用框架,因此,在所有測試啟動前,需要對這些框架進行初始化。有寫過單體測試的朋友都知道,這部分邏輯應(yīng)該寫在Class Initialize的方法中:

 
 
 
 
  1. [ClassInitialize()]
  2. public static void MyClassInitialize(TestContext testContext)
  3. {
  4.     Database.SetInitializer(new
  5.         DropCreateDatabaseIfModelChanges());
  6.     MongoDBRepositoryContext.RegisterConventions();
  7.     if (!BsonClassMap.IsClassMapRegistered(typeof(SalesLine)))
  8.     {
  9.         BsonClassMap.RegisterClassMap(p =>
  10.         {
  11.             p.AutoMap();
  12.             p.UnmapProperty(q => q.SalesOrder);
  13.         });
  14.     }
  15. }

在這里并沒有使用代碼的方式對NHibernate框架進行初始化,因為NHibernate的初始化過程是由Apworks中的NHibernateApplicationConfiguration類型完成的,這個類型依賴應(yīng)用程序的app/web.config文件。所以我們需要在單體測試項目中添加app.config以及相關(guān)的配置節(jié)點。篇幅原因,這里就不貼app.config的代碼了,文章末尾我會給出源代碼。Visual Benchmark支持在“客戶應(yīng)用程序域”(Client AppDomain)中裝載app/web.config文件。

現(xiàn)在,可以開始寫測試方法了,以下是基于三種不同倉儲實現(xiàn)的測試方法。從各方法中我們可以看到,除了所創(chuàng)建的IRepositoryContext、IRepository的具體實現(xiàn)不同之外,其它的操作邏輯完全相同:即通過倉儲對聚合進行保存:

 
 
 
 
  1. [TestMethod]
  2. public void EntityFramework()
  3. {
  4.     using (IRepositoryContext context = new EntityFrameworkRepositoryContext(new EntityFrameworkDbContext()))
  5.     {
  6.         IRepository salesOrderRepository = new EntityFrameworkRepository(context);
  7.         foreach (var salesOrder in mockSalesOrders)
  8.             salesOrderRepository.Add(salesOrder);
  9.         context.Commit();
  10.     }
  11. }
  12.  
  13. [TestMethod]
  14. public void NHibernate()
  15. {
  16.     using (IRepositoryContext context = new NHibernateContext(new NHibernateApplicationConfiguration()))
  17.     {
  18.         IRepository salesOrderRepository = new NHibernateRepository(context);
  19.         foreach (var salesOrder in mockSalesOrders)
  20.             salesOrderRepository.Add(salesOrder);
  21.         context.Commit();
  22.     }
  23. }
  24.  
  25. [TestMethod]
  26. public void MongoDB()
  27. {
  28.     using (IRepositoryContext context = new MongoDBRepositoryContext(new MongoDBRepositoryContextSettings()))
  29.     {
  30.         IRepository salesOrderRepository = new MongoDBRepository(context);
  31.         foreach (var salesOrder in mockSalesOrders)
  32.             salesOrderRepository.Add(salesOrder);
  33.         context.Commit();
  34.     }
  35. }

執(zhí)行測試

首先,我們在Visual Studio中測試這三個方法,以確保每個方法都能夠正確完成。在啟動測試之前,先回到上面的MyTestInitialize方法,將thisIteration設(shè)置為一個固定的整數(shù)值,比如20,以便測試能夠正常啟動。在完成三個方法的測試之后,我們可以通過Test Results窗口看到測試結(jié)果。

打開Visual Benchmark,新建一個Session,在“打開”對話框中,選擇已經(jīng)編譯好的DLL文件,此時Visual Benchmark會將其中包含的所有的測試類和測試方法加載到左邊的樹形結(jié)構(gòu)中。在樹形結(jié)構(gòu)中,選中需要測試的方法,然后單擊“開始”按鈕,Visual Benchmark便會針對所選的測試方法進行基準(zhǔn)測試。最后,會根據(jù)不同的測試引擎的設(shè)計,將結(jié)果顯示出來。

測試結(jié)果

Visual Benchmark能夠根據(jù)設(shè)置,采用一些減噪手段以盡量保證測試結(jié)果的真實性。通過所測結(jié)果不難看出,在我所測試的三個場景中,基于MongoDB實現(xiàn)的倉儲,性能要優(yōu)于其它兩者。而NHibernate倉儲又要好于Entity Framework倉儲。

測試環(huán)境

以下是執(zhí)行測試的環(huán)境配置:

CPU:Intel Core i5-540M Cores: 2 Logical: 4

Chipset:Intel QM57 (IbexPeak-M DO)

Memory:Hynix 666.7MHz (PC3-10600) 2048MB x1, Kingston 666.7MHz (PC3-10600) 4096MB x1. Totally 6144MB

OS:Microsoft Windows 7 Enterprise (x64) Build 7601

場景一:聚合保存

注:上圖中X軸表示的是“代”數(shù),亦即模擬的聚合數(shù)量;Y軸表示執(zhí)行時間(毫秒數(shù))。下同。

場景二:聚合查詢

注:在此場景中,EntityFramework支線所表示的是使用Eager Loading將SalesOrder及其下所有Sales Lines實體讀出所開銷的時間;而EntityFramework_NoEagerLoad支線所表示的是僅讀出SalesOrder(不包括其下所有Sales Lines)所開銷的時間。

場景三:查詢所有并刪除

關(guān)于Visual Benchmark

Visual Benchmark是我在2010年開發(fā)的一款基于Visual Studio單體測試框架的性能基準(zhǔn)測試程序,從整體上看,Visual Benchmark具有如下架構(gòu)設(shè)計:

首先,Visual Benchmark和被測試的程序集都是基于Microsoft .NET Framework的,在Visual Benchmark中,基準(zhǔn)測試的執(zhí)行是以Session為單位的。Engine Management System為Visual Benchmark提供了安全的、可擴展的基準(zhǔn)測試引擎管理系統(tǒng),因此,通過這套管理系統(tǒng),用戶可以選用各種不同的引擎進行測試,開發(fā)人員也可以根據(jù)自己的實際需求對引擎進行二次開發(fā)與定制,并應(yīng)用到Visual Benchmark系統(tǒng)中。

其次,當(dāng)Session被打開時,它會通過Remote Proxy將被測試的程序集裝載到客戶應(yīng)用程序域(Client AppDomain)中。這樣做的理由是:1、能夠在完成測試后,以AppDomain.Unload的方式卸載被測試程序集;2、能夠在裝載程序集時,同時將app/web.config和resource都裝載到Client AppDomain中,以此模擬真實的執(zhí)行環(huán)境。

功能技術(shù)特點

Visual Benchmark具有如下功能技術(shù)特點:

可定制的基準(zhǔn)測量標(biāo)尺:開發(fā)人員可以自己開發(fā)基準(zhǔn)測試的測量標(biāo)尺。目前僅支持兩種:StopwatchTickRuler和StopwatchMillisecondsRuler。上文的測試采用的是StopwatchMillisecondsRuler

可定制的測試引擎:開發(fā)人員可以根據(jù)需求定制開發(fā)測試引擎??蚣芴峁┝送暾囊娑ㄖ乒δ?,這包括:引擎的元數(shù)據(jù)(例如名稱、作者、描述等)、版本、配置界面、結(jié)果顯示界面以及HTML文檔。目前支持Iterated Throughput、Simple、Simple Iteration以及Throughput四種引擎。上文的測試采用了Simple Iteration引擎

減噪選項:使用減噪選項以獲得更真實的測試數(shù)據(jù)。Visual Benchmark提供兩個減噪選項:在每次執(zhí)行測試之前強制垃圾回收、丟棄第一次的測試結(jié)果。測試引擎也會根據(jù)情況提供獲取平均執(zhí)行時間的選項

在客戶應(yīng)用程序域(Client AppDomain)中執(zhí)行基準(zhǔn)測試:能夠?qū)误w測試環(huán)境進行模擬,被測方法能夠正常地訪問配置文件和資源文件

跨AppDomain的單件(Singleton)實現(xiàn):能夠方便地在單體測試方法中讀取Visual Benchmark的相關(guān)參數(shù)信息

多線程執(zhí)行:用戶可以隨時停止Benchmark的執(zhí)行

界面截圖

基于兩種不同引擎的執(zhí)行結(jié)果顯示

測試引擎的配置界面與文檔界面

Session信息與客戶應(yīng)用程序域(Client AppDomain)信息

總結(jié)

本文對Apworks框架中所支持的三種倉儲實現(xiàn)進行了性能上的基準(zhǔn)測試,并得出了測試結(jié)果。在最開始的時候,我是打算結(jié)合Visual Studio的測試框架來完成這些工作的,但后來發(fā)現(xiàn)Visual Studio的測試框架所提供的功能并不能達(dá)到我的需求,之前也采用了Visual Studio的Load Test來做壓力測試,但是效果并不算太理想。在下才疏學(xué)淺,并沒有弄通Visual Studio提供的強大測試功能,所以也只能借用我之前寫的Visual Benchmark程序了。如果有讀者朋友知道如何在Visual Studio中完成類似的測試工作,還煩請告知在下,我會虛心向您學(xué)習(xí)。

下一步,我將對Apworks框架的線程安全性做一些評估,等到有了滿意的結(jié)果,我也會將相關(guān)經(jīng)驗分享出來。


本文標(biāo)題:Apworks框架各種倉儲實現(xiàn)的性能基準(zhǔn)測試
新聞來源:http://www.5511xx.com/article/dpgpeds.html