In client-server use the connection speed can play an important role in the query performance.
QueryPerformanceBenchmark.cs: RunClientServerTest private void RunClientServerTest() { InitForClientServer(); Clean(); System.Console.WriteLine("Storing " + _count + " objects of depth " + _depth + " remotely:"); Open(ConfigureClientServer()); Store(); Close(); Open(ConfigureClientServer()); StartTimer(); IQuery query = objectContainer.Query(); query.Constrain(typeof(Item)); query.Descend("_name").Constrain("level1/1"); Item item = (Item)query.Execute().Next(); StopTimer("Select 1 object: " + item._name); Close(); Init(); Clean(); System.Console.WriteLine("Storing " + _count + " objects of depth " + _depth + " locally:"); Open(ConfigureClientServer()); Store(); Close(); Open(ConfigureClientServer()); StartTimer(); query = objectContainer.Query(); query.Constrain(typeof(Item)); query.Descend("_name").Constrain("level1/1"); item = (Item)query.Execute().Next(); StopTimer("Select 1 object: " + item._name); Close(); }
QueryPerformanceBenchmark.cs: InitForClientServer private void InitForClientServer() { _filePath = "performance.db4o"; _isClientServer = true; _host = "localhost"; }
QueryPerformanceBenchmark.cs: ConfigureClientServer private IConfiguration ConfigureClientServer() { IConfiguration config = Db4oFactory.NewConfiguration(); config.Queries().EvaluationMode(QueryEvaluationMode.Immediate); config.ClientServer().SingleThreadedClient(true); return config; }
Results from the test machine:
Storing 30000 objects of depth 3 remotely:
Store 90000 objects: 10725ms
Select 1 object: level1/1: 1763ms
Storing 10000 objects of depth 3 locally:
Store 30000 objects: 2904ms
Select 1 object: level1/1: 630ms
In order to improve the performance use Lazy or Snapshot evaluation modes.
Download example code: