2015-05-28 6 views
2

В настоящее время у меня есть программа C++, получающая запросы от веб-приложения через сокет и генерирующая взамен Json-файл (150 Ko), который будет прочитан этим приложением.Самый быстрый способ передачи большого количества данных между двумя приложениями

  1. Я задавался вопросом, не будет ли быстрее предоставлять данные непосредственно через сокет?
  2. если да, то какой будет самый быстрый формат для его отправки (Json, Xml, персонализированный формат, который я бы проанализировал сам, ...)?
  3. Должен ли я отправить весь пакет (150 Ko) сразу или я должен передать его через сокет?
+0

«Самый быстрый» означает «быстро его перевести» или «быстро его перерабатывать»? Вы можете экспериментировать с основными алгоритмами сжатия и временем ваших ответов. –

+0

Быстрое переключение и обработка его быстро ... Но чем больше я думаю об этом, я бы сказал, что время обработки на самом деле, почему я действительно хочу уменьшить – Arcyno

+0

. Вы должны взглянуть на Googles Protobuf. –

ответ

2

Если я правильно понимаю, что вы написали правильно, веб-сервер отправляет запросы вашей программе на C++ и вы хотите, чтобы приложение PHP считывало данные, сделав веб-запрос на веб-сервер, который, в свою очередь, пересылает запрос на программу C++ для обслуживания ответа.

Вот три идеи для повышения скорости этой установки:

  1. Рассмотрим с использованием потокового парсер для разбора данных, считанных из гнезда. Это позволит вашему приложению PHP начать потреблять и обрабатывать данные, прежде чем все данные будут прочитаны из сокета.

    Многие библиотеки JSON не предлагают API для анализа потокового разбора (см. Is there a streaming API for JSON?). Например, встроенные JSON-интерфейсы PHP не работают. Но см. Incremental JSON parsing in php.

    PHP имеет встроенный синтаксический анализатор XML, XMLReader. Если ваша C++-программа сгенерировала XML-данные, вы можете использовать XMLReader в PHP для постепенного анализа XML, что означает, что вашему PHP-приложению не нужно ждать, пока данные будут полностью загружены.

  2. Если ваша программа на С ++ читает JSON из файла и отправляет содержимое файла через сокет, рассмотрите возможность использования zero-copy I/O. См. Также vmsplice().

  3. Если программа C++ и ваше приложение PHP работают на одном сервере, вы можете использовать сегмент разделяемой памяти. Это исключило бы необходимость передачи данных по сокету, потому что программа C++ и приложение PHP имели бы доступ к сегменту памяти. Программа C++ записывает все данные в сегмент разделяемой памяти, а затем приложение PHP будет читать данные.

    Для получения дополнительной информации см. PHP Semaphore functions.

+0

. В моем случае третий вариант кажется идеальным! .. Я постараюсь узнать, как это сделать ...Я не вижу, как я могу определить программу C++, где находится разделяемая память, выделенная моим php-приложением. – Arcyno

+0

@Arcyno: я бы определенно попробовал один и два первых, чтобы убедиться, что это повышает скорость, достаточную для вашего приложения. 150 KiB не так много данных, поэтому кажется, что ваше приложение не связано в первую очередь с I/O. Для идеи три, вам нужно будет изменить свой C++, чтобы эффективно вызвать PHP shm_put_var(). Кроме того, обратите внимание, что все еще есть некоторые накладные расходы на встроенные функции общей памяти PHP в виде сортировки/разборки данных. Ваш лучший вариант может заключаться в том, чтобы написать собственное расширение для PHP, чтобы напрямую публиковать данные в общей памяти. –