【问题标题】:Why GNU Readline so slow?为什么 GNU Readline 这么慢?
【发布时间】:2012-08-21 03:02:55
【问题描述】:

我写了一个加密程序。

#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

程序花费太多时间从标准输入读取文本。如果我删除&gt; /dev/null,我可以看到程序正在从标准输入读取,太慢了!

我也写了没有 GNU Readline 的版本,速度非常快。

为什么?我该如何解决?

【问题讨论】:

  • 这是 GNU Readline 的常见抱怨。另一个选择可能是加州理工学院Tecla library

标签: c libreadline


【解决方案1】:

因为它提供的功能。

提供一组功能供应用程序使用,允许用户 在键入时编辑命令行。Emacs 和 vi 编辑 模式可用。

我认为你可以使用 open 函数

if (!strcmp(*argv, "-"))
  fd = fileno(stdin);
else fd = open(*argv, O_RDONLY|O_NONBLOCK, 0);

如果你想从标准输入中读取,并提供 - 作为文件名

【讨论】:

  • 但是 Python 也使用 readline 没有性能问题。为什么?
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 2017-05-10
  • 2016-09-28
  • 2020-02-08
  • 2012-07-17
  • 2011-11-07
  • 2015-08-24
  • 2013-08-06
相关资源
最近更新 更多