Почему GNU Readline такой медленный?
Я пишу программу для шифрования.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <readline/readline.h>
int main(void) {
char * plain;
char letter;
int value;
int index;
plain = readline("Please input your plain text: ");
printf("Please input your key (included negatives): ");
scanf("%i", &value);
for (index = 0; index < strlen(plain); index++) {
letter = plain[index];
if (letter >= 'A' && letter <= 'Z') {
fprintf(stderr, "%c", (letter - 'A' + value) % 26 + 'A');
}
else if (letter >= 'a' && letter <= 'z') {
fprintf(stderr, "%c", (letter - 'a' + value) % 26 + 'a');
}
else {
fprintf(stderr, "%c", letter);
}
}
fprintf(stderr, "\n");
free(plain);
}
И я сделал несколько тестов:
biergaizi@localhost ~/learning_c/test $ time ./caesar_readline < lots_of_letters 2> c_readline_result > /dev/null
real 2m31.212s
user 2m30.776s
sys 0m0.165s
Программа тратит слишком много времени на чтение текста со стандартного ввода. Если я удалю > /dev/null
Я вижу, программа читает со стандартного ввода, слишком медленно!
Я также написал версию без GNU Readline, она очень быстрая.
Зачем? И как я могу это решить?
1 ответ
Решение
Потому что функция, которую он предоставляет.
предоставляет набор функций для использования приложениями, которые позволяют пользователям редактировать командные строки по мере их ввода. Доступны как режимы редактирования Emacs, так и vi.
Я думаю, что вы можете просто использовать открытую функцию
if (!strcmp(*argv, "-"))
fd = fileno(stdin);
else fd = open(*argv, O_RDONLY|O_NONBLOCK, 0);
и предоставить - в качестве имени файла, если вы хотите читать из стандартного ввода