【问题标题】:fastest way to communicate a lot of data between two applications [closed]在两个应用程序之间传输大量数据的最快方法[关闭]
【发布时间】:2015-08-11 01:42:55
【问题描述】:

我目前有一个 c++ 程序通过套接字从 Web 应用程序接收请求,并生成一个 Json 文件 (150 Ko) 作为返回值,该文件将由该应用程序读取。

  1. 我想知道直接通过套接字提供数据会不会更快?
  2. 如果是这样,发送它的最快格式是什么(Json、Xml、我自己解析的个人格式……)?
  3. 我应该一次发送整个包裹 (150 Ko) 还是应该通过套接字流式传输?

【问题讨论】:

  • 'fastest' 是指“快速传输”还是“快速处理”?您可以尝试基本的压缩算法并确定您的响应时间。
  • 最快的应该是快速传输和处理它......但我越想,我会说处理时间实际上是我真正想要减少的原因
  • 你应该看看 Googles Protobuf。
  • 不知道 Protobuf.. 看起来真的很不错!但它只会帮助我减少数据的正确时间,而不是读取(因为它与 php 不兼容)
  • 什么是150 Ko,150 KB 或千字节或...?

标签: php c++ sockets


【解决方案1】:

如果我理解您所写的内容正确,则 Web 服务器正在将请求转发到您的 C++ 程序,并且您希望 PHP 应用程序通过向 Web 服务器发出 Web 请求来读取数据,然后 Web 服务器将请求转发到用于提供响应的 C++ 程序。

以下是提高此设置速度的三个想法:

  1. 考虑使用流解析器来解析从套接字读取的数据。这将允许您的 PHP 应用程序在从套接字读取所有数据之前开始使用和处理数据。

    许多 JSON 库不提供流式解析 API(请参阅 Is there a streaming API for JSON?)。例如,PHP 的内置 JSON API 没有。但是,请参阅Incremental JSON parsing in php

    PHP 有一个内置的 XML 拉解析器,XMLReader。如果您的 C++ 程序生成 XML 数据,您可以在 PHP 中使用 XMLReader 以增量方式解析 XML,这意味着您的 PHP 应用程序无需等待数据完全下载。

  2. 如果您的 C++ 程序正在从文件中读取 JSON 并通过套接字发送文件的内容,请考虑使用 zero-copy I/O。另见vmsplice()

  3. 如果 C++ 程序和您的 PHP 应用程序在同一台服务器上运行,您可以使用共享内存段。这将消除通过套接字传输数据的需要,因为 C++ 程序和 PHP 应用程序都可以访问一段内存。 C++ 程序会将所有数据写入共享内存段,然后 PHP 应用程序会读取数据。

    请参阅 PHP 的 Semaphore functions 了解更多信息。

【讨论】:

  • 在我的情况下,第三个选项似乎很完美!..我会尝试学习如何做到这一点...我不知道如何告诉 c++ 程序共享内存在哪里由我的 php 应用程序分配
  • @Arcyno:我肯定会先尝试一个和两个,看看这是否可以为您的应用程序提高足够的速度。 150 KiB 并不是很多数据,因此您的应用程序似乎主要不受 I/O 限制。对于想法三,您需要修改您的 C++ 以有效地调用 PHP 的 shm_put_var()。另外,请注意,PHP 的内置共享内存例程以编组/解组数据的形式仍然存在一些开销。您最好的选择可能是为 PHP 编写一个自定义扩展,以更直接地公开共享内存中的数据。
猜你喜欢
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多