Оптимизация массива PHP Hashtable - PullRequest
0 голосов
/ 10 марта 2011

Я сделал PHP-приложение, для выполнения которого требовалось около 0,0070 с. Теперь я добавил массив хеш-таблиц с около 2000 значений. Внезапно время выполнения увеличилось до ~ 0,0700 с. Почти в 10 раз больше предыдущего значения.

Я попытался закомментировать часть, в которой я искал внутри массив хеш-таблиц (но массив все еще оставался определенным). Тем не менее, время выполнения остается около ~ 0,0500 сек.

Массив - это что-то вроде:

$subjectinfo = array(
        'TPT753' => 'Industrial Training',
        'TPT801' => 'High Polymeric Engineering',
        'TPT802' => 'Corrosion Engineering',
        'TPT803' => 'Decorative ,Industrial And High Performance Coatings',
        'TPT851' => 'Project');

Есть ли способ оптимизировать эту часть?

Я не могу использовать базу данных, так как я запускаю это приложение на движке приложений Google, который все еще не поддерживает базу данных JDO для php.

Еще немного кода из приложения:

function getsubjectinfo($name)
    {
        $subjectinfo = array(
        'TPT753' => 'Industrial Training',
        'TPT801' => 'High Polymeric Engineering',
        'TPT802' => 'Corrosion Engineering',
        'TPT803' => 'Decorative ,Industrial And High Performance Coatings',
        'TPT851' => 'Project');

    $name = str_replace("-", "", $name);
    $name = str_replace(" ", "", $name);
    if (isset($subjectinfo["$name"]))
        return "(".$subjectinfo["$name"].")";
    else
        return "";
   }

Тогда я использую следующее утверждение в приложении 2-3 раза:

echo $key." ".$this->getsubjectinfo($key)

Ответы [ 4 ]

1 голос
/ 10 марта 2011
function getsubjectinfo($name)
{
    $subjectinfo = array(
    'TPT753' => 'Industrial Training',
    'TPT801' => 'High Polymeric Engineering',
    'TPT802' => 'Corrosion Engineering',
    'TPT803' => 'Decorative ,Industrial And High Performance Coatings',
    'TPT851' => 'Project');
// ..
}

Таким образом, массив создается каждый раз, когда вы вызываете функцию.Рассмотрите возможность использования статической переменной здесь

function getsubjectinfo($name)
{
    static $subjectinfo = array(
    'TPT753' => 'Industrial Training',
    'TPT801' => 'High Polymeric Engineering',
    'TPT802' => 'Corrosion Engineering',
    'TPT803' => 'Decorative ,Industrial And High Performance Coatings',
    'TPT851' => 'Project');
// ..
}

И в качестве обозначения: Вы также можете использовать базу данных SQLite:)

Обновление: подход ООП

class MyClass {
    public static $subjectnames = array(
      'TPT753' => 'Industrial Training',
      'TPT801' => 'High Polymeric Engineering',
      'TPT802' => 'Corrosion Engineering',
      'TPT803' => 'Decorative ,Industrial And High Performance Coatings',
      'TPT851' => 'Project');

    public function getsubjectinfo($name) {
        $name = str_replace("-", "", $name);
        $name = str_replace(" ", "", $name);
        if (isset(self::$subjectnames["$name"]))
            return "(".self::$subjectnames["$name"].")";
        else
            return "";
    }
}
0 голосов
/ 10 марта 2011

Однажды я прочитал, что вы можете оптимизировать такую ​​статическую конфигурацию массива с помощью сериализации / десериализации.

Вставьте в ваш исходный код сериализованную версию массива.Это будет строка.

Используйте unserialize (..) для динамического построения массива.

Городская легенда гласит, что это может сэкономить некоторое время при разборе.

еще одна вещь, которую вы можетепопробуйте использовать свойства объекта вместо ключей массива.

$ obj-> TRV3463 может быть быстрее, чем доступ к массиву.

0 голосов
/ 10 марта 2011

Урок дня учащийся - определение больших массивов в конструкторе классов может ускорить процесс.

Я изменил код как:

class myclass
{
    var $subjectnames = array();
    function myclass()
    {
        $this->subjectnames = array(
    'TPT753' => 'Industrial Training',
    'TPT801' => 'High Polymeric Engineering',
    'TPT802' => 'Corrosion Engineering',
    'TPT803' => 'Decorative ,Industrial And High Performance Coatings',
    'TPT851' => 'Project');
    }


function getsubjectinfo($name)
    {
        //$subjectinfo = array();
        $name = str_replace("-", "", $name);
        $name = str_replace(" ", "", $name);
        if (isset($this->subjectnames["$name"]))
            return "(".$this->subjectnames["$name"].")";
        else
            return "";
    }
}
0 голосов
/ 10 марта 2011

Вы можете попробовать использовать целые числа в качестве ключей в вашей таблице.

"Но все ключи не обязательно имеют TPT, они могут быть TOE362, AGS612 и т. Д. Я отсортировал их в порядке возрастания, но интересно, помогло ли это."

Хешируйте ваши исходные строки в числовые данные и используйте этот вывод в качестве ваших хеш-ключей. Да, за каждый доступ (за дополнительный хэш) взимается штраф за постоянное время, но если ваш окончательный набор данных достаточно велик, я подозреваю, что это может превзойти, если PHP напрямую использует строковые ключи.

Если ничего не помогает, напишите чувствительный к производительности код на C и скомпилируйте его как расширение PHP. Нет, еще лучше, напишите все приложение на C. Еще лучше, используйте прямой машинный код для всего. Или подключите макет с вашей желаемой логикой! Справка: http://xkcd.com/378/

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