2009-12-30 90 views
6

我已經使用面向方面編程(PostSHARP)創建了自定義ORM工具的原型,並實現了持久性無知(編譯期之前)。現在我試圖找出與使用純DataReader和ADO.NET相比,它引入了多少開銷。我做了一個測試用例 - 在MS SQL Server 2008和MySQL Community Edition中插入,讀取,刪除數據(大約1000條記錄)。我使用純ADO.NET和我的自定義工具多次運行此測試。我期望的結果將取決於許多因素 - 內存,交換,CPU,其他進程,所以我跑了很多次的測試(20-40)。但結果真的出乎意料。這些案件之間的差異太大了。如果只有一些極端的價值觀,我可以忽略它們(可能會交換髮生的或不合適的),但它們非常不同,我相信我不能相信這種測試。幾乎有一半的時候,我的ORM比純ADO.NET的性能提高了10%,其他時間只有-10%。測試自定義ORM解決方案性能開銷 - 如何?

有什麼辦法可以讓這些測試可靠嗎?我沒有一臺功能強大的計算機,內存很多,但是也許我可以在這些測試中以某種方式使MS SQL和MySQL或ADO.NET儘可能一致。那麼如何記錄數量 - 哪個更可靠,使用少量記錄並運行更多次數或其他方式?

回答

6

你見過ORMBattle.NET?參見FAQ there,有一些想法涉及到由特定的ORM工具引入的測量性能開銷。測試套件是open source

關於結果:

  • 一些ORM工具自動批處理語句序列(即幾個SQL語句一起發送)。如果這個特性在ORM中得到了很好的實現,那麼在CRUD操作中,如果ADO.NET測試不涉及批處理,在ADO.NET上擊敗2-4次操作就很容易了。 ORMBattle.NET測試兩種情況。
  • 很大程度上取決於您如何在那裏建立交易界限。詳情請參閱ORMBattle.NET FAQ
  • CRUD測試並不是最好的性能指標。總的來說,在這裏很容易獲得最高性能,因爲一般來說,在這種情況下,RDBMS必須比ORM做得多得多。

P.S.我是ORMBattle.NET作者之一,所以如果您對細節/可能的貢獻感興趣,可以直接與我聯繫(或加入ORMBattle.NET Google Groups)。

3

我會運行測試更長的時間,並有更多的迭代,因爲隨着時間的推移,小的差異將平均,你應該得到更清晰的圖片。此外,請確保您排除了任何可能影響您測試的外部事物,例如其他正在運行的進程,沒有足夠的可用內存,冷啓動與熱啓動,網絡使用等。

另外,請確保您的數據庫文件和日誌文件有足夠的可用空間分配,因此您不會在某些測試期間等待數據庫增長該文件。

2

首先你需要找出方差來自哪裏。 ORM層本身還是數據庫?

很多時候,這種變化的來源是數據庫本身。數據庫是非常複雜的系統,其中有很多活動的進程可以與性能測量結果相互作用。爲了獲得一些可重現的結果,你必須將你的數據庫放置在「實驗室」條件下,並確保沒有意外發生。這意味着從供應商到供應商,您需要知道一些非常高級的主題才能實現這樣的目標。例如,SQL Server數據庫上變化的典型來源是:

  • 冷緩存與溫暖高速緩存(數據和程序)
  • 日誌和數據庫增長的事件
  • 維護作業
  • 鬼清理
  • 惰性寫入
  • 關卡
  • 外部存儲器壓力
+0

感謝您的提示。我發現MySql的結果比MS SQL更不一致,所以我想我必須從我的測試中排除MySQL。 – JustAMartin 2009-12-31 13:42:58