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

Apworks框架各種倉(cāng)儲(chǔ)實(shí)現(xiàn)的性能基準(zhǔn)測(cè)試

開(kāi)發(fā) 后端
周末抽空簡(jiǎn)單地對(duì)Apworks框架所支持的三種倉(cāng)儲(chǔ)實(shí)現(xiàn):Entity Framework、NHibernate以及MongoDB進(jìn)行了性能基準(zhǔn)測(cè)試,并對(duì)其結(jié)果進(jìn)行對(duì)比。從對(duì)比的結(jié)果來(lái)看,MongoDB倉(cāng)儲(chǔ)的性能要遠(yuǎn)勝于其它兩者。基準(zhǔn)測(cè)試采用的是我在兩年前開(kāi)發(fā)的一個(gè)基于Visual Studio Unit Test Framework的基準(zhǔn)測(cè)試程序(名為:Visual Benchmark),該程序可以設(shè)定基準(zhǔn)測(cè)試引擎,并對(duì)測(cè)試結(jié)果進(jìn)行圖形化呈現(xiàn)。在本文末尾會(huì)簡(jiǎn)要地對(duì)此軟件進(jìn)行介紹,有興趣的朋友不妨了解一下。

單體測(cè)試的設(shè)計(jì)

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

舉例來(lái)說(shuō),在測(cè)試三種不同的倉(cāng)儲(chǔ)對(duì)于聚合的保存執(zhí)行效率時(shí),我首先在Visual Studio中新建了一個(gè)Unit Test類(lèi),并在類(lèi)中定義了兩個(gè)成員變量:

  1. [TestClass] 
  2. public class InsertAggregateRootsTest 
  3.     private int thisIteration; 
  4.     private IEnumerable<SalesOrder> mockSalesOrders; 
  5.     // 其它部分暫時(shí)省略 

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

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

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

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

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

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

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

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

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

執(zhí)行測(cè)試

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

image

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

image

測(cè)試結(jié)果

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

測(cè)試環(huán)境

以下是執(zhí)行測(cè)試的環(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

場(chǎng)景一:聚合保存

Insert

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

場(chǎng)景二:聚合查詢(xún)

Retrieve

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

場(chǎng)景三:查詢(xún)所有并刪除

FindAndDelete

關(guān)于Visual Benchmark

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

image

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

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

功能技術(shù)特點(diǎn)

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

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

可定制的測(cè)試引擎:開(kāi)發(fā)人員可以根據(jù)需求定制開(kāi)發(fā)測(cè)試引擎。框架提供了完整的引擎定制功能,這包括:引擎的元數(shù)據(jù)(例如名稱(chēng)、作者、描述等)、版本、配置界面、結(jié)果顯示界面以及HTML文檔。目前支持Iterated Throughput、Simple、Simple Iteration以及Throughput四種引擎。上文的測(cè)試采用了Simple Iteration引擎

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

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

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

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

界面截圖

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

image

測(cè)試引擎的配置界面與文檔界面

image

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

image

總結(jié)

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

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

原文鏈接:http://www.cnblogs.com/daxnet/archive/2012/07/31/2616197.html

【編輯推薦】

 

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2016-09-23 16:36:25

LinuxPCPhoronix

2023-07-31 09:13:13

ValidatorGolang

2021-07-17 15:25:05

PHP 8.1基準(zhǔn)測(cè)試開(kāi)發(fā)

2024-03-06 18:09:06

Linux性能工具

2009-10-10 11:11:40

服務(wù)器測(cè)試

2025-01-06 06:10:00

開(kāi)源.NEThttps://mp

2021-07-08 14:59:05

JMHMongodb數(shù)據(jù)

2022-03-29 11:48:40

Go泛型測(cè)試

2013-05-07 09:47:30

測(cè)試MySQLMySQL測(cè)試

2023-08-30 13:22:00

測(cè)試框架工具

2019-06-19 10:00:45

vue.jsimbajavascript

2023-12-21 14:02:35

機(jī)器學(xué)習(xí)深度學(xué)習(xí)

2011-07-19 09:35:46

.Net

2012-12-18 13:32:45

IBMdW

2015-06-17 13:58:22

Java序列化庫(kù)

2011-09-22 13:49:44

XML基準(zhǔn)測(cè)試

2020-10-23 14:05:39

AI 服務(wù)器測(cè)試

2015-07-21 09:18:48

Windows 10Windows 8性能

2023-05-12 07:38:46

Python基準(zhǔn)測(cè)試性能分析

2009-02-09 11:06:19

WindowsUbuntuWindows7
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 三级免费av| 中文字幕第二区 | av手机免费在线观看 | 日韩看片 | 成人高清在线视频 | 国产一区在线免费观看视频 | 看a级黄色毛片 | 亚洲精品自在在线观看 | 国产精品伦一区二区三级视频 | 黄网站涩免费蜜桃网站 | 欧美日韩国产一区二区三区 | 国产精品日韩欧美一区二区 | 国产精品久久久久久吹潮日韩动画 | 精品国产一区二区在线 | 欧美日韩91 | 自拍偷拍亚洲欧美 | 中文字幕在线观看视频一区 | 91精品免费视频 | 久久99精品国产 | 一区二区三区视频在线 | 欧美国产精品一区二区三区 | 亚洲精彩免费视频 | 久久久不卡网国产精品一区 | 午夜寂寞影院列表 | 欧美日韩成人在线 | 久久黄色网 | 欧美日韩亚洲视频 | 欧美一区二区免费 | 精品国产乱码久久久久久蜜柚 | 久久99精品久久 | 免费视频二区 | 免费一区在线观看 | 精品国产乱码久久久久久丨区2区 | 亚洲综合色站 | 国产蜜臀97一区二区三区 | 日本人麻豆 | 日日人人| 国产精品久久久久久久久久 | 国产精品99久久久久久动医院 | 99成人免费视频 | 一区二区蜜桃 |