Сам neo4jclient использует REST API, поэтому вы уже ограничены в производительности (по пропускной способности, задержке в сети и т. д.) по сравнению с прямым вызовом API (для которого вам понадобится Java).
- Какое выступление вам нужно?
- Какой код вы используете?
Некоторые первоначальные мысли и тесты, чтобы попробовать:
Очевидно, что есть такие вещи, как ЦП и т. д., которые могут привести к некоторому троттлингу, некоторые вещи, которые следует учитывать:
- Сервер Neo4J находится на той же машине?
- Пробовали ли вы свое приложение не через Visual Studio? (т.е. без отладки)
В моем тестовом коде (ниже) я получаю 10 записей примерно за 200 мс. Можете ли вы попробовать этот код в простом консольном приложении и посмотреть, что получится?
private static void Main()
{
var client = new GraphClient(new Uri("http://localhost.:7474/db/data"));
client.Connect();
for (int i = 0; i < 10; i++)
CreateEmptyNodes(10, client);
}
private static void CreateEmptyNodes(int numberToCreate, IGraphClient client)
{
var start = DateTime.Now;
for (int i = 0; i < numberToCreate; i++)
client.Create(new object());
var timeTaken = DateTime.Now - start;
Console.WriteLine("For {0} items, I took: {1}ms", numberToCreate, timeTaken.TotalMilliseconds);
}
РЕДАКТИРОВАТЬ:
Это необработанный подход HttpClient к вызову «Создать», который, я считаю, аналогичен тому, что делает neo4jclient под капотом:
private async static void StraightHttpClient(int iterations, int amount)
{
var client = new HttpClient {BaseAddress = new Uri("http://localhost.:7474/db/data/")};
for (int j = 0; j < iterations; j++)
{
DateTime start = DateTime.Now;
for (int i = 0; i < amount; i++)
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Post, "cypher/") { Content = new StringContent("{\"query\":\"create me\"}", Encoding.UTF8, "application/json") });
if(response.StatusCode != HttpStatusCode.OK)
Console.WriteLine("Not ok");
}
TimeSpan timeTaken = DateTime.Now - start;
Console.WriteLine("took {0}ms", timeTaken.TotalMilliseconds);
}
}
Теперь, если вы не заботитесь об ответе, вы можете просто вызвать Client.SendAsync(..)
без ожидания, и вы получите элегантную ~ 2500 в секунду. Однако очевидно, что большая проблема здесь заключается в том, что вы не обязательно отправляли какие-либо из этих созданий, вы в основном ставили их в очередь, поэтому сразу после этого закройте свою программу, и, скорее всего, у вас не будет записи, или очень небольшое количество.
Итак... ясно, что код может без проблем обрабатывать x тысяч вызовов в секунду (я провел тест, аналогичный приведенному выше, с использованием ServiceStack и RestSharp, оба занимают одинаковое время с HttpClient).
Что он не может сделать, так это отправить их на фактический сервер с той же скоростью, поэтому мы ограничены стеком http Windows и / или скоростью, с которой n4j может обработать запрос и предоставить ответ.
person
Charlotte Skardon
schedule
23.08.2013