2013-07-19 2 views
0

Я надеюсь, что кто-то может дать мне некоторое представление об этой странности. Я не знаю, есть ли какая-то утечка или мой способ использования MongoDB не прав. Я скопировал код из MongoDB CSharp ecosystem tutorial. Когда я начал возиться с ним, я заметил, что время для выполнения запроса постепенно возрастало. Я использую C# 4.5, MongoDB 2.4.5 и работает под управлением Windows 7.Выполнение запроса MongoDB снова и снова с использованием C# и замедления

Время выполнения начального запроса заняло около 33 мс, но с каждой итерацией цикла он постепенно увеличивается. Каждый раз, когда я запускаю этот код, время запроса начинается примерно с 33 мс, но увеличивается до 61 мс. Если я использую идентификатор, он начинается с 15 мс и увеличивается до 34 мс. Я также попытался использовать Linq и родной синтаксис стиля EQ с объектом Query и имел аналогичные возрастающие результаты. Я бы ожидал, что время будет увеличиваться и уменьшаться с каждой итерацией, но не постоянно увеличиваться. Я довольно новичок в 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

Хм, как он себя ведет при выполнении 1000 или 5000 запросов? Увеличиваются ли времена? Возможно, это связано с пулом соединений. Кроме того, вы можете устранить потенциальные проблемы профилирования, как описано в этой статье: http://www.codeproject.com/Articles/61964/Performance-Tests-Precise-Run-Time-Measurements-wi – mnemosyn

+0

Интересно! ... при 1000 итерациях потребовалось почти две секунды, которые по совпадению были примерно в то же время, что и программа. Поэтому я переместил эту строку «Секундомер sw = новый секундомер();» внутри цикла for, и он решил проблему. Таким образом MongoDB работает очень хорошо, и это было мое незнание с использованием секундомера, не называя «Сброс». Спасибо за информацию! – Stu

ответ

0

Ответ был на то, что я неправильно использовал секундомер, не вызывая Reset() до Start(). Так что это фактически не имело ничего общего с MongoDB.

0

Конечно, это будет все медленнее, потому что вам нужно индексировать по сбору на Name, так как вы делаете запрос collection.FindOne(query); фильтрация на Name поле.

Смежные вопросы