【问题标题】:PHP json_encode slow for big arrays大型数组的PHP json_encode慢
【发布时间】:2018-11-20 11:03:59
【问题描述】:

我有一些 json_encode 相关的问题:我需要使用一个大数组(几个 100k 项),每个都有非常简单的结构(一个键,一个字符串值)。 json_decode 工作正常,但是一旦我想对其进行 json_encode 编码,它就非常慢。 由于我完全控制了这里的数据,所以我尝试编写一个超级简单的 json 编码器,而且速度很快。 我很惊讶,因为我的编码功能很粗糙,并且没有任何内部 php 优化,而 json_encode 中肯定存在。

知道可能是什么问题吗?

我把我的编码器功能放在下面供参考。

谢谢

protected function simpleJsonEncoder($data) {
    if (is_array($data)) {
        $is_indexed = (array_values($data) === $data);
        $tab_str = [];
        if ($is_indexed) {
            foreach($data as $item) {
                $str_item = $this->simpleJsonEncoder($item);
                $tab_str[] = $str_item;
            }
            $result = '[' . implode(',', $tab_str) . ']';
        }
        else {
            foreach($data as $index => $item) {
                $str_item = $this->simpleJsonEncoder($item);
                $tab_str[] = '"' . htmlspecialchars($index, ENT_QUOTES) . '":' . $str_item;
            }
            $result = '{' . implode(',', $tab_str) . '}';
        }
    }
    else {
        $result = '"' . htmlspecialchars($data, ENT_QUOTES) . '"';
    }

    return $result;
}

【问题讨论】:

  • 我不明白您的评论:您在这里看到的循环是创建的函数的一部分,因为 json_encode 非常慢。没有循环是带有 json_encode 的原始代码:$json = json_encode($big_tab);
  • 找不到。有链接吗?
  • 嗯,它讨论了 json 与序列化的优缺点,但没有真正的线索说明为什么 json_encode 对大的简单数组如此慢。我真的不明白我的函数如何比原生 php 更快,这对我来说似乎很荒谬。

标签: php json performance jsonencoder


【解决方案1】:

为了后代:我一直在尝试寻找 json_encode 的替代方法来同步大量数据,序列化速度更快,但显然返回的字符串大小要大得多。我偶然发现了这个页面。我尝试了这个函数 - md5 哈希与 json_encode 不同,时间差可以忽略不计。从我最近阅读的所有内容来看,他们已经在某个地方优化了 json_encode。

我使用的是 PHP 7.3,时间以秒为单位(大对象)

"user_func_hash": "xxx",
"user_func_time": 45.33081293106079,
"json_encode_hash": "yyy",
"json_encode_time": 45.759231090545654

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2018-05-21
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多