首先看看php原始碼變數值儲存:
typedef union _zvalue_value str;
hashtable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
php陣列的值儲存在zvalue_value.ht裡面,它是乙個hashtable。hashtable的特點:
所以$array['key']這樣子獲取資料,就會需要做一次hash才會知道bucket的位置,才能拿到值。
typedef struct _bucket
bucket;
typedef struct _hashtable
hashtable;
hashtable的資料結構,通過這段原始碼可以看出來,如果是foreach的話,可以直接通過bucket.next獲取到下乙個值,而如果是for迴圈則需要做一次hash才能知道bucket的位址,所以foreach比for迴圈效率更高一些。
java為什麼 foreach比for效率高
1 for是使用下標 偏移量 定位的.2 foreach應該是使用類似迴圈子的機構 3 對隨機訪問效率高的arraylist.使用下標訪問效率本身很高.foreach內部的迴圈子直接封裝下標,自己實現的for比foreach更直接,效率稍高些,但差別不會太大,仍然在乙個數量級上。4 如果使用插入和刪...
memset 的效率以及原始碼分析
void memset void s,int ch,size t n 作用 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。不知道有沒有像我一樣把memset當作萬能的初始化工具,例如 int arr ...
memset 的效率以及原始碼分析
void memset void s,int ch,size t n 作用 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。不知道有沒有像我一樣把memset當作萬能的初始化工具,例如 int arr ...