Я пишу простую ncurses GUI-оболочку для nmap под Linux, чтобы упростить чтение и понимание вывода. Однако, когда дело доходит до разбора вывода, быстрее ли использовать регулярное выражение POSIX и оценивать каждое выражение в моем коде или передавать вывод nmap в такие утилиты, как grep
, sed
или cut
?Regex vs. Piping с точки зрения скорости
Например, если я хочу получить интернет-хосты в подсети, какие из следующих решений могут быть лучше?
pipe = popen("nmap -sn xxx.xxx.xxx.xxx/24", "r");
if (pipe == NULL) {
fprintf (stderr, "error creating the pipe: %s\n", strerror(errno));
exit (1);
}
while (!feof (pipe)) {
if (fgets (buff, BUFF_SIZE, pipe) != NULL) {
/* perform regex evaluations here */
printf ("%s", buff);
}
}
pclose (pipe);
против
pipe = popen("nmap -sn xxx.xxx.xxx.xxx/24 | grep -E 'pattern' | ...", "r");
if (pipe == NULL) {
fprintf (stderr, "error creating the pipe: %s\n", strerror(errno));
exit (1);
}
while (!feof (pipe)) {
if (fgets (buff, BUFF_SIZE, pipe) != NULL) {
printf ("%s", buff);
}
}
pclose (pipe);
Я бы запустил некоторые тесты бенчмаркинга, если бы я был вами. – Eregrith
Я бы оценил это, но я бы подумал, что использование regex будет быстрее, потому что это то, что эти инструменты, вероятно, будут делать в любом случае, плюс у вас есть накладные расходы, чтобы сообщить ОС, чтобы начать другой процесс, и все, что подразумевает –
@Eregrith well , главная причина, почему я спросил об этом, - это то, что я никогда раньше не использовал библиотеку регулярных выражений POSIX, поэтому я бы не стал изучать что-то новое, если оно бесполезно и есть более быстрые методы. –