PHP Hashtable数组优化

时间:2011-03-10 14:06:19

标签: php optimization hashtable

我制作了一个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');

有没有办法优化这部分?

我无法使用数据库,因为我在谷歌应用程序引擎上运行此应用程序仍然不支持PHP的JDO数据库。

来自应用的更多代码:

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 个答案:

答案 0 :(得分:1)

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-Database:)

更新:OOP方法

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 "";
    }
}

答案 1 :(得分:0)

您可以尝试将整数用作表格中的键。

“但是所有的钥匙都不一定有TPT,它们可能是TOE362,AGS612等。我已按升序排序,但不知道它是否有帮助。”

将原始字符串哈希化为数字数据,并将该输出用作哈希键。是的,每次访问涉及一个恒定时间惩罚(对于额外的哈希),但如果你的最终数据集足够大,我怀疑这可能胜过让PHP直接使用字符串键。

如果所有其他方法都失败了,请在C中编写性能敏感代码并将其编译为PHP扩展。不,更好的是,用C编写整个应用程序。更好的是,使用直接的机器代码来处理所有事情。或者用您想要的逻辑连接面包板!参考:http://xkcd.com/378/

答案 2 :(得分:0)

每天课程学习 - 在类构造函数中定义大型数组可以加快速度。

我将代码修改为:

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 "";
    }
}

答案 3 :(得分:0)

我曾经读过你可以通过serialize / unserialize来优化这样的静态数组配置。

在源代码中注入数组的序列化版本。它将是一个字符串。

使用unserialize(..)动态构建数组。

Urban legend说它可能会节省一些解析时间。

您可以尝试的另一件事是使用对象属性而不是数组键。

$ obj-> TRV3463可能比数组访问更快。