2013-07-19 42 views
0

我希望有人能夠讓我對這種古怪的事情有所瞭解。我不知道是否有某種泄漏,或者我使用MongoDB的方式很古怪。我從MongoDB CSharp ecosystem tutorial複製了一些代碼。當我開始搞亂它時,我注意到執行查詢的時間正在逐漸增加。我使用的是C#4.5,MongoDB 2.4.5,並運行Windows 7.使用C#反覆運行MongoDB查詢並且變得越來越慢

執行初始查詢的時間大約需要33 ms,但循環的每次迭代都會逐漸增加。每次我運行這個代碼時,查詢時間從大約33毫秒開始,但增加到61毫秒。如果我使用ID,它將從15 ms開始並增加到34 ms。我也嘗試在查詢對象中同時使用Linq和本地EQ樣式語法,並且有類似的增加結果。我預計每次迭代都會增加和減少時間,但不會不斷增加。我對MongoDB非常陌生,第一次看到它是在2天前,所以對於使用代碼的方式來了解正在發生的事情或錯誤的任何洞察將不勝感激。 (爲什麼我這樣做 - 我碰巧注意到起飛的機會,同樣的查詢是越來越慢,得到了好奇

using System; 
using System.Diagnostics; 
using MongoDB.Bson; 
using MongoDB.Driver; 
using MongoDB.Driver.Builders; 

namespace Snippets 
{ 
    public class Entity 
    { 
     public ObjectId Id { get; set; } 
     public string Name { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Stopwatch sw = new Stopwatch(); 

      var connectionString = "mongodb://localhost"; 
      var client = new MongoClient(connectionString); 
      var server = client.GetServer(); 
      var database = server.GetDatabase("test"); 

      var collection = database.GetCollection<Entity>("entities"); 

      var entity = new Entity { Name = "X" }; 

      collection.Insert(entity); 

      var query = Query<Entity>.Where(e => e.Name == "X"); 

      for (int i = 0; i < 100; i++) 
      { 
       sw.Start(); 

       var item = collection.FindOne(query); 

       sw.Stop(); 

       Console.WriteLine("{0:0} ms", sw.ElapsedMilliseconds); 
      } 

      collection.Remove(query); 
     } 
    } 
} 
+1

嗯,當你執行1,000或5,000個查詢時它的行爲如何?時間還在增加嗎?也許這與連接池有關。另外,您可能想要消除本文中討論的潛在分析問題:http://www.codeproject.com/Articles/61964/Performance-Tests-Precise-Run-Time-Measurements-wi – mnemosyn

+0

有趣! ......在1000次迭代中,它幾乎花了兩秒鐘的時間恰巧與程序運行時間大致相同。所以我移動了這一行「Stopwatch sw = new Stopwatch();」在for循環中,它解決了這個問題。所以MongoDB的工作很好,這是我不知道秒錶的使用,因爲沒有調用「重置」。謝謝(你的)信息! – Stu

回答

0

答案是我沒有在Start()之前調用Reset()來錯誤地使用Stopwatch。所以這實際上與MongoDB無關。

0

當然它會越來越慢,因爲你需要指數集合因爲您在Name字段進行查詢collection.FindOne(query);篩選。