一邊學習c,一邊研究zend引擎,邊學習邊總結。
hashtable的初始化:
zend_api int _zend_hash_init(hashtable *ht, uint nsize, hash_func_t phashfunction, dtor_func_t pdestructor, zend_bool persistent zend_file_line_dc)
else
ht->ntablesize = 1 << i;
}// tablemask 為最高位為0,其他位均為1的數
// bucket 在 hashtable 中的位置,通過 hash 值與 tablemask 來決定
ht->ntablemask = ht->ntablesize - 1;
// 儲存指向析構函式的指標
ht->pdestructor = pdestructor;
ht->arbuckets = null;
ht->plisthead = null;
ht->plisttail = null;
ht->nnumofelements = 0;
ht->nnextfreeelement = 0;
ht->pinternalpointer = null;
ht->persistent = persistent;
/* uses ecalloc() so that bucket* == null */
if (persistent)
ht->arbuckets = tmp;
} else
}return success;
}
向hashtable中增加或更新元素:
zend_api int _zend_hash_add_or_update(hashtable *ht, const char *arkey, uint nkeylength, void *pdata, uint ndatasize, void **pdest, int flag zend_file_line_dc)
// 根據鍵的名稱和長度求出hash值
h = zend_inline_hash_func(arkey, nkeylength);
// 將hash值與hashtable的mask相與,得出該鍵值在hashtable中的儲存位置為 nindex
nindex = h & ht->ntablemask;
// 將二維陣列arbucket第一維下標為 nindex 的 bucket 陣列賦值給 p
p = ht->arbuckets[nindex];
// 迴圈這個陣列,直到最後乙個元素,迴圈結束後p處於 bucket 陣列的最後乙個位置
while (p != null)
handle_block_interruptions();
#if zend_debug
if (p->pdata == pdata)
#endif
// 程式沒有在前面 return ,說明是更新已有元素
// 將當前儲存的資料解構
if (ht->pdestructor)
// 更新資料
update_data(ht, p, pdata, ndatasize);
// 如果需要返回更新後的資料,返回給pdest變數
if (pdest)
handle_unblock_interruptions();
// 如果更新成功,返回
return success;}}
// 移向 bucket 陣列的下乙個元素
p = p->pnext;
}// 如果是新增,並且沒有重複的元素,繼續往下執行
// 因為bucket陣列的最後乙個元素是陣列,所以可以實現可變長的儲存
// 由於 struct bucket 在定義的時候 arkey 長度為1,所以先-1,然後再分配nkeylength的長度
p = (bucket *) pemalloc(sizeof(bucket) - 1 + nkeylength, ht->persistent);
if (!p)
// 賦值
memcpy(p->arkey, arkey, nkeylength);
p->nkeylength = nkeylength;
init_data(ht, p, pdata, ndatasize);
p->h = h;
connect_to_bucket_dllist(p, ht->arbuckets[nindex]);
if (pdest)
handle_block_interruptions();
connect_to_global_dllist(p, ht);
ht->arbuckets[nindex] = p;
handle_unblock_interruptions();
// hashtable 儲存的元素加1
ht->nnumofelements++;
zend_hash_if_full_do_resize(ht); /* if the hash table is full, resize it */
return success;
}
(持續更新中……)
Zend引擎的優化
在php 5.4的更新list上,有一句 提公升了zend引擎的效能,減少了記憶體占用.那麼,到底是怎麼提公升的呢?我們知道在php中,類的屬性 靜態屬性 常量,都是儲存在hashtable中的,而在以前,即使乙個類沒有申明屬性 靜態屬性 常量,zend引擎也會為他們分配hashtable.而在現在...
Zend引擎的優化
在php 5.4的更新list上,有一句 提公升了zend引擎的效能,減少了記憶體占用.那麼,到底是怎麼提公升的呢?我們知道在php中,類的屬性 靜態屬性 常量,都是儲存在hashtable中的,而在以前,即使乙個類沒有申明屬性 靜態屬性 常量,zend引擎也會為他們分配hashtable.而在現在...
PHP核心 Zend引擎
在前面的章節介紹了php的生命週期,php的sapi,sapi處於php整個架構較上層,而真正指令碼的執行主要由zend引擎來完成,這一小節我們介紹php指令碼的執行。目前程式語言可以分為兩大類 但它們並不是真的直接就被能被機器理解,機器只能理解機器語言,那這些語言是怎麼被執行的呢,一般這些語言都需...