3

根据我使用创建节点的基准

GraphClient.Create()

性能还有很多不足之处。我的机器上每秒大约有 10 个空节点(Core i3,8 GB RAM)。

即使我使用多线程执行创建时间,每个Create()调用速度也会线性增加(使用 N 个线程时约为 N 次)。

我已经测试了稳定的 1.9.2 和 2.0.0-M04。结果完全一样。

有人知道出了什么问题吗?

编辑:我尝试使用neo4j REST API,得到了类似的结果:每秒约20个空节点,多线程也没有任何好处。

编辑 2:同时允许批量创建的 Batch REST API 提供了更好的性能:每秒大约 250 个节点。处理单个请求似乎有令人难以置信的巨大开销......

4

2 回答 2

4

Poor performance caused by overhead in processing RESTful Cypher query. Mostly it is network overhead but overhead caused by need to parse query also exists.

Use Core Java API when you interested in high performance. Core Java API provides more than 10 times faster requests processing than Cypher query language.

See this articles:

于 2013-08-25T17:48:55.317 回答
1

neo4jclient 本身使用 REST API,因此与直接 API 调用(您需要 Java)相比,您的性能(带宽、网络延迟等)已经受到限制。

  • 你追求什么样的表现?
  • 你在运行什么代码?

一些初步的想法和测试:

显然有一些像 CPU 之类的东西会导致一些节流,需要考虑一些事情:

  1. Neo4J 服务器是否在同一台机器上?
  2. 您是否尝试过通过 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 处理请求和提供响应的速度的限制。

于 2013-08-23T10:53:38.343 回答