Почему нельзя обрабатывать изображения с помощью PHP? - PullRequest
1 голос
/ 16 марта 2012

Я делаю базовую попиксельную обработку изображения размером 500x500 пикселей.Независимо от того, какое уравнение я вставил, если ему не хватает памяти, оно делает это за ужасное количество времени.

Сравните этот скрипт:

define('STARTED_AT',microtime(true));
set_time_limit(0);

function calculatesomething(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething2(); }
function calculatesomething2(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething3(); }
function calculatesomething3(){ return abs(100-round(pow(15/150,2)))+pow(2,4); }

$r = array();
foreach(range(1,pow(10,5)) as $x){
    foreach(range(1,4) as $y)
        $r[] = calculatesomething();
}

$o = (microtime(true)-STARTED_AT);
echo 'took '.$o.'ms to finish';

потребовалось 38,847129106522s, чтобы закончить

А вот это:

define('STARTED_AT',microtime(true));
set_time_limit(0);

function calculatesomething(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething2(); }
function calculatesomething2(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething3(); }
function calculatesomething3(){ return abs(100-round(pow(15/150,2)))+pow(2,4); }

$r = array();
foreach(range(1,pow(10,5)) as $x){
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
}

$o = (microtime(true)-STARTED_AT);
echo 'took '.$o.'ms to finish';

потребовалось 29 .651962041855s, чтобы закончить

Только труднозакодировал вложенные итерации и дополнительные вызовы функций и получил 9 мс.У меня 2,4 ГГц двухъядерный и 4 ГБ оперативной памяти;Разве не должно быть иначе?Что я могу сделать, чтобы улучшить вычислительные возможности PHP?

Ответы [ 4 ]

3 голосов
/ 16 марта 2012

Один МОЖЕТ выполнять обработку изображений с помощью PHP - я делаю это часто и отвечаю моим требованиям, о, так мило.

Все зависит от того, каковы ваши ограничения по пространству и времени.

Если вы делаете это вPHP на сервере через запрос браузера не сокращает его, тогда вам нужно пересмотреть свои алгоритмы, а затем свои инструменты.

У вас есть много вариантов, но вам нужно дать реальный пример использования, прежде чем кто-нибудь сможет вас направить.

0 голосов
/ 17 марта 2012

После 9 часов утомительного исследования я наконец нашел функцию ImageMagick :: fxImage, которая это делает!Пиксельная обработка с математикой.

Чувак, я так рад, что разбил бы арбуз в скале, как в Ледниковый период.

http://www.imagemagick.org/script/fx.php

Спасибо всем!

0 голосов
/ 16 марта 2012

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

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

0 голосов
/ 16 марта 2012

После ответа Зафа я еще покопался и нашел PHP медленен при соединении строк?

Я использовал array('row1'=>array('col1'=> array($r,$g,$b), [...]), [...]) для хранения значений пикселей. Похоже, побитовые операции работают намного быстрее, и я пойду с ними вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...