awk部分原始碼分析 RS及三種模式

2021-06-19 14:14:12 字數 925 閱讀 5492

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,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...