Я обнаружил, что gawk реализован на C, и я использовал для написания программы C для обработки txt-файла, это стоило много времени в части ввода-вывода, и, возможно, есть и другие проблемы в моей программе на C.Почему awk хорошо работает в эффективности
Программа для фильтрации адреса IP-из файла, и формат каждой строки
T 218.241.107.98 117.44.215.39 7 2719 1378472723 N 0 0 0 G 0 I 218.241.107.97,0.130,1 218.241.98.45,0.265,1 192.168.1.253,0.181,1 159.226.253.77,0.218,1 159.226.253.46,4.367,1 219.142.17.37,1.062,1 118.84.3.5,2.976,1 202.97.34.134,29.026,1
После процесса, формат каждой строки должен нравится этот
218.241.107.98 117.44.215.39 218.241.107.97 218.241.98.45 192.168.1.253 159.226.253.77 159.226.253.46 219.142.17.37 118.84.3.5 202.97.34.134
, я написал awk следующим образом:
#!/usr/bin/awk -f
BEGIN {
FS = "[, \t]"
}
{
for(i = 1; i <= NF; i++)
{
if ($1 == "#")
continue
if ($i ~ /((([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5]))/)
printf $i"\t"
if (i == NF)
printf "\n"
}
}
Программа C слишком велика, чтобы на нее надеть, я просто опишу ее схему:
Я использую open() (fcntl.h), чтобы открыть исходный файл и перенаправить на него стандартный ввод, поэтому я использую функцию ввода, например scanf() или getchar(), чтобы прочитать файл в строке buf (i обрабатывать линию каждый раз). После этого я использую строчную функцию, такую как strchr(), чтобы получить информацию, которую хочу, а затем помещаю в выходной файл
для этого случая программа c намного медленнее, чем awk, почему?
И вообще, как awk реализует эффективность, почему это так эффективно?
Любые парни имеют некоторое представление об этом, может быть, лучше взять пример.
PS: Я загружаю исходный код gawk, но мне трудно читать. Есть ли какие-то предложения?
спасибо :)
Как мы можем сказать, не видя код C и Awk? –
сейчас я показываю случай @larsmans –
Я все еще могу только догадываться, но имейте в виду, что Awk и Gawk используют некоторые довольно умные регулярные выражения/конечные реализации автомата. Awk происходит из Bell Labs, где в то время работали Aho, Thompson и другие автоматы. –