Арифметика с плавающей запятой, C / C как поступить?

#php #c #web-applications

#php #c #веб-приложения

Вопрос:

Я создаю веб-приложение, которое выполняет очень сложные арифметические вычисления с плавающей запятой, и их много! Я много читал и прочитал, что вы можете создавать функции C (и C ) и вызывать их из PHP, мне было интересно, замечу ли я увеличение скорости при этом?

Я хотел бы сделать это таким образом, даже если это всего лишь второе отличие, если только оно на самом деле не медленнее.

Комментарии:

1. Я бы рекомендовал вам сосредоточиться на том, чтобы ваше приложение работало, и беспокоиться о его оптимизации позже, если у вас возникнут проблемы.

2. Я согласен с приведенным выше комментарием. Я ДЕЙСТВИТЕЛЬНО думаю, что это было бы быстрее (особенно, если это действительно так сложно в вычислениях, как вы говорите). Действительно сложно сказать, насколько быстрее это будет только с этой информацией.

3. спасибо за совет! Это мой план на данный момент, меня интересовал опыт обучения тому, как заставить их работать вместе, если возможен прирост производительности.

4. Функции, которые делают что именно? Если вы просто планируете выполнять арифметические вычисления (например: 10/2 и т.д.), Передача этого на аутсорсинг расширению PHP, вероятно, займет больше времени, чем просто выполнение этого в PHP.

5. Я передам около 6 чисел, и он выполнит около 75-100 вычислений и передаст ответы обратно. Здесь не будет небольших вызовов функций, и там это будет один большой вызов. Это было то, что мне было интересно узнать, займет ли больше времени вызов C, чем просто выполнение PHP.

Ответ №1:

Все зависит от фактического количества выполняемых вами вычислений. Если вам нужно выполнить тысячи вычислений, то, безусловно, стоит написать расширение, чтобы справиться с этим за вас. В частности, если у вас много данных, именно здесь PHP действительно терпит неудачу: его диспетчер памяти не может обрабатывать много объектов или большие массивы (исходя из опыта работы с такими данными).

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


Обновление до «75-100 вычислений с 6 числами».

Если вы делаете это только один раз за загрузку страницы, я подозреваю, что это не будет значительной частью общего времени загрузки (зависит от того, что еще вы делаете, конечно). Если вы вызываете эту функцию много раз, то да, даже 75 операций могут быть медленными — однако, поскольку вы используете только 6 переменных, возможно, их оптимизатор хорошо справится (тогда как со 100 переменными это практически гарантировано).

Комментарии:

1. Если вы хотите убедиться, что у вас было какое-либо увеличение скорости от модуля C / C , вам в любом случае понадобится эталонная реализация для сравнения.

2. @TomKerr, никогда не забывайте, что PHP действительно медленно обрабатывает вычисления / данные. Даже более 50 операций с плавающей запятой будут намного быстрее в C. Вопрос в том, имеет ли время отношение ко времени загрузки страницы вообще. При нескольких тысячах операций с плавающими числами вы, вероятно, достигли этой точки. PHP также довольно небезопасен для типов, поэтому на самом деле может быть намного проще написать сложный алгоритм на C.

3. @edA-qamort-ora-y: На каком основании вы можете утверждать, что вычисления на C будут намного быстрее, чем на PHP? PHP очень близок к уровню C, особенно для таких вещей, как математика. Выполнение простых вычислений в PHP на 100 000 FP займет около 25 мс. Пытаться создать расширение PHP с помощью так хорошо документированного движка Zend , чтобы ускорить время, вероятно, пустая трата времени.

4. @netcoder, основанный на опыте обработки данных в PHP. Доступ к данным — самая большая проблема: загрузка / хранение большого количества данных в массивах. Если это не проблема, скажем, с 6 переменными, у вас может все получиться. Однако из-за динамической типизации и отсутствия JIT PHP просто не может приблизиться к языку компиляции машинного кода (например, C) с точки зрения производительности вычислений.

Ответ №2:

Проверьте SWIG.

Swig — это способ довольно легко создавать модули php (и других языков) из ваших исходных текстов на Си.

Комментарии:

1. Спасибо за ссылку, но мой вопрос касался того, получу ли я законное увеличение скорости.

2. Вы не узнаете, пока не попробуете.

3. действительно ли swig работает со скоростью C? Судя по всему, он просто преобразует существующий код в PHP. Я все еще работаю над тем, чтобы запустить и запустить его, и не смог протестировать.

4. Swig — это способ довольно легко создавать модули php (и других языков) из ваших исходных текстов на Си.

5. Я пытался это настроить, но swig продолжает выдавать мне подобные ошибки при попытке выполнить руководство на веб-сайте: example_wrap.c:689:18: zend.h: нет такого файла или каталога