PHP中互動變數的優化

2021-07-10 18:43:26 字數 1581 閱讀 9425

在程式設計中,我們大多考慮是功能的實現,很少過多的考慮記憶體消耗問題。比如在交換兩個變數的值,大多時候我們是通過第三個變數來進行交換的,真的php來說,通過第三個變數來交換,是比較消耗記憶體的。看下面**

$startmemoryused=memory_get_usage();

$i=5;

$j=6;

$c=$i;

$i=$j;

$j=$c;

var_dump('i='.$i.',j='.$j);

$endmemoryused=memory_get_usage();

$usedmemory=($endmemoryused-$startmemoryused)/1024;

var_dump('新增變數互動消耗記憶體為:'.$usedmemory.'mb');

$startmemoryused=memory_get_usage();

$i=5;

$j=6;

$i=$i^$j;

$j=$i^$j;

$i=$i^$j;

var_dump('i='.$i.',j='.$j);

$endmemoryused=memory_get_usage();

$usedmemory=($endmemoryused-$startmemoryused)/1024;

var_dump('異或互動消耗記憶體為:'.$usedmemory.'mb');

現在我們來看一下,記憶體消耗結果:

這說明如果我們借助第三個變數互動值的話,是通過異或互動消耗記憶體的9.5倍,不測試不知道,一測試還真的嚇一跳啊。

細究其原因,這和php核心中資料結構是分不開的

php在核心中是通過zval這個結構體來儲存變數的,它的定義在zend/zend.h檔案裡,簡短精煉,只有四個成員組:

struct _zval_struct ;

typedef struct _zval_struct zval;

//在zend/zend_types.h裡定義的:

typedef unsigned int zend_uint;

typedef unsigned char zend_uchar;

zval裡的refcout__gc是zend_uint型別,也就是unsinged int型,is_ref__gc和type則是unsigned char型的。儲存變數

值的value則是zvalue_value型別(php5),它是乙個union,同樣定義在了zend/zend.h檔案裡:

typedef union _zvalue_value  str;

hashtable *ht; /* hash table value */

zend_object_value obj;

} zvalue_value;

在以上實現的基礎上,php語言得以實現了8種資料型別,也真是基於這樣的定義,才使得php是比較消耗記憶體的。

php中自變數 PHP 變數

php 變數作用域 變數的作用域是指令碼中變數可被引用和使用的部分,php 中有四種不同的變數作用域 序號作用域 描述local 區域性作用域 global 全域性作用域 static 靜態作用域 parameter 函式引數作用域 1 local 本地的 區域性變數的作用域 在 php 函式內部宣...

PHP 中的變數

變數用於儲存值,比如數字 文字字串或陣列。一旦設定了某個變數,我們就可以在指令碼中重複地使用它。php 中的所有變數都是以 符號開始的。在 php 中設定變數的正確方法是 var name value php 的入門者往往會忘記在變數的前面的 符號。如果那樣做的話,變數將是無效的。讓我們試著建立乙個...

PHP中的變數

變數是儲存內容的別稱,就像人名是人的代稱一樣,php中的變數用來指代數值 字串 陣列等,它的命名要遵守一定的規則 php變數命名規則 變數要以美元符號 開頭,如 abc 2 定義乙個變數abc 變數的名稱必須以字母或者下劃線開頭,不能以數字開頭,如 nba 2 a 3 分別定義兩個變數並給予賦值 變...