memcached save 数据的一些疑问
众所周知,memcached保存的时候可以这样写:
<code>$memcached->save("a", array("abc","bacd"), MEMCACHE_COMPRESSED, 0); </code>
以及:
<code>$memcached->save("a", json_encode(array("abc","bacd")), MEMCACHE_COMPRESSED, 0); </code>
但,问题就来了,经过1W调数据测试,若 $data =array();中包含中文汉字 通过 json_encode 存入memcached后,明显要比直接存入array的速度要慢很多很多。
可是memcache的底层save的时候,如果传递的$value为array()那么采用serialize进行序列化。
可是,jsonencode和serialize的性能差异非常大,jsonencode明显会要比serialize要快许多。
求问,memcached最终传递什么值为好?array?还是string?
回复内容:
众所周知,memcached保存的时候可以这样写:
<code>$memcached->save("a", array("abc","bacd"), MEMCACHE_COMPRESSED, 0); </code>
以及:
<code>$memcached->save("a", json_encode(array("abc","bacd")), MEMCACHE_COMPRESSED, 0); </code>
但,问题就来了,经过1W调数据测试,若 $data =array();中包含中文汉字 通过 json_encode 存入memcached后,明显要比直接存入array的速度要慢很多很多。
可是memcache的底层save的时候,如果传递的$value为array()那么采用serialize进行序列化。
可是,jsonencode和serialize的性能差异非常大,jsonencode明显会要比serialize要快许多。
求问,memcached最终传递什么值为好?array?还是string?
json_encode明显要比serialize快很多?R U SURE?
<code><?php $str = '但,问题就来了,经过1W调数据测试,若 $data =array();中包含中文汉字 通过 json_encode 存入memcached后,明显要比直接存入array的速度要慢很多很多。'; function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $time_start = microtime_float(); for ($i = 2000000; $i > 0; $i--) serialize($str); printf("serialize: in %f seconds\n", microtime_float() - $time_start); $time_start = microtime_float(); for ($i = 2000000; $i > 0; $i--) json_encode($str); printf("json_encode: in %f seconds\n", microtime_float() - $time_start); </code>
Run:
serialize: in 0.928114 seconds
json_encode: in 4.315019 seconds
发现了上面的结论,下面可以直接被忽略了,仅供参考。
@iCode的说法可能是一部分的原因;更重要的是,无论是serialize还是json_encode,肯定都是O(n)的,只是serialize的常数可能比json_encode大;然而,由于serialize是在memcache内部调用的,是直接了当地转换,存到sendbuf里,所以可以省掉相当的转换开销:
<code>//memcache_binary_protocol.c +416 status = mmc_pack_value(pool, &(request->sendbuf), value, &flags TSRMLS_CC); => default: php_var_serialize(&(buffer->value), &value_copy_ptr, &value_hash TSRMLS_CC); ...; mmc_compress(pool, buffer, buffer->value.c + prev_len, buffer->value.len - prev_len, flags, 1 TSRMLS_CC); </code>
而json_encode则不然:必须先分配一块空间,存进去,生成一个对应的zval对象,扔回php,再由php交给memcache,然后:
<code>//memcache_binary_protocol.c +416 status = mmc_pack_value(pool, &(request->sendbuf), value, &flags TSRMLS_CC); => case IS_STRING: *flags |= MMC_TYPE_STRING; mmc_compress(pool, buffer, Z_STRVAL_P(value), Z_STRLEN_P(value), flags, 0 TSRMLS_CC); </code>
可以想象,在这样一个过程中,使用json_encode的开销显著增加了。所以它比直接serialize更差是可以理解的。
至于到底该用哪个,说真的,php本来性能就差得很,不用特别在意这个地方,它往往不太可能会是性能的瓶颈。如果真的觉得到了性能优化要抠这里的时候(估计你更可能会选择用其他语言重写,例如python)(或者恭喜你,可以去找投资人了),方法很多,再不济至少你可以直接修改memcache的源码,把php_var_serialize改成json_encode。
<code><?php $str = '但,问题就来了,经过1W调数据测试,若 $data =array();中包含中文汉字 通过 json_encode 存入memcached后,明显要比直接存入array的速度要慢很多很多。'; $jstr = json_encode( $str ); $sstr = serialize( $str ); echo strlen( $jstr ), ' | ', $jstr, PHP_EOL, strlen( $sstr ), ' | ', $sstr; /* 336 | "\u4f46\uff0c\u95ee\u9898\u5c31\u6765\u4e86\uff0c\u7ecf\u8fc71W\u8c03\u6570\u636e\u6d4b\u8bd5\uff0c\u82e5 $data =array();\u4e2d\u5305\u542b\u4e2d\u6587\u6c49\u5b57 \u901a\u8fc7 json_encode \u5b58\u5165memcached\u540e\uff0c\u660e\u663e\u8981\u6bd4\u76f4\u63a5\u5b58\u5165array\u7684\u901f\u5ea6\u8981\u6162\u5f88\u591a\u5f88\u591a\u3002" 199 | s:190:"但,问题就来了,经过1W调数据测试,若 $data =array();中包含中文汉字 通过 json_encode 存入memcached后,明显要比直接存入array的速度要慢很多很多。"; */ </code></code>
越长存起来就越慢的道理你是懂的吧 ..?

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP에서 데이터베이스 작업은 매우 쉽습니다. 이번 장에서는 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 이해하겠습니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP에 로그인하는 것은 매우 쉬운 작업입니다. 한 가지 기능만 사용하면 됩니다. cronjob과 같은 백그라운드 프로세스에 대해 오류, 예외, 사용자 활동, 사용자가 취한 조치를 기록할 수 있습니다. CakePHP에 데이터를 기록하는 것은 쉽습니다. log() 함수는 다음과 같습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
