neo4jclient 本身使用 REST API,因此与直接 API 调用(您需要 Java)相比,您的性能(带宽、网络延迟等)已经受到限制。
一些初步的想法和测试:
显然有一些像 CPU 之类的东西会导致一些节流,需要考虑一些事情:
- Neo4J 服务器是否在同一台机器上?
- 您是否尝试过不通过 Visual Studio 的应用程序?(即没有调试)
在我的测试代码(如下)中,我在大约 200 毫秒内得到了 10 个条目——你能在一个简单的控制台应用程序中尝试这个代码,看看你得到了什么吗?
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 相似的时间)。
它不能以相同的速率将它们发送到实际服务器,因此我们受到 windows http 堆栈和/或 n4j 处理请求和提供响应的速度的限制。