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ヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。
