awk的程式執行過程,總是先讀取一部分資料到buf下,根據rs擷取一段段記錄下來。
rs做為awk的內建變數,即可以在awk程式中進行設定,也可以用引數的形式進行指定。
這篇文章討論的是從awk的原始碼去分析在不同的rs下的三種執行分支及其相應的效率
以下開始分析原始碼:
首先,awk呼叫get_a_record 函式獲取單條記錄,在get_a_record函式裡,先讀入一段資料到buf下
iop->count = read(iop->fd, iop->buf, iop->readsize);
再對buf進行分析,根據rs擷取一段記錄
ret = (*matchrec)(iop, & recm, & state);
這裡的matchrec 函式指標指向的函式,就是用來做rs匹配的,具體是哪個函式呢?根據不同的rs,有這麼三種附值結果
if (rs->stlen == 0)
else if (rs->stlen > 1) {
matchrec = rsrescan;
else matchrec = rs1scan;
可見,awk的根據不同的rs,實際上是走三種流程去從buf裡擷取一條記錄資訊的。
1:預設的/n,或null, 這個在程式裡,相當簡潔的單字元判斷(while (*bp != rs) bp++;),效率也是最高的。
2:多字元,這個實際上把rs當成了正則,呼叫了正則去匹配了。這裡討論下去,就是awk的正則效率問題了。
3:非/n的單字元。這個涉及到awk的歷史,為了兼顧不同的locale,這裡的單字元判斷不似第一種那樣簡單的判斷,還對各類字元的字元長度進行了相容性的擴充套件判斷,直接影響了效率
原始碼裡很長的一段說明有興趣的可以去看看,這邊只轉其中一句話:
/* thus, the check for /n here; big speedup ! */
awk部分原始碼分析 RS及三種模式
awk的程式執行過程,總是先讀取一部分資料到buf下,根據rs擷取一段段記錄下來。rs做為awk的內建變數,即可以在awk程式中進行設定,也可以用引數的形式進行指定。這篇文章討論的是從awk的原始碼去分析在不同的rs下的三種執行分支及其相應的效率 以下開始分析原始碼 首先,awk呼叫get a re...
awk部分原始碼分析 RS及三種模式
awk的程式執行過程,總是先讀取一部分資料到buf下,根據rs擷取一段段記錄下來。rs做為awk的內建變數,即可以在awk程式中進行設定,也可以用引數的形式進行指定。這篇文章討論的是從awk的原始碼去分析在不同的rs下的三種執行分支及其相應的效率 以下開始分析原始碼 首先,awk呼叫get a re...
redux原始碼分析(三) 原始碼部分
下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...