为什么第一次调用readline()会减慢对fnmatch()的所有后续调用?

时间:2014-08-23 01:20:31

标签: c++ c linux readline glob

以下程序说明了这个问题:

生成文件:

CFLAGS = -O3 -std=c++0x
LDFLAGS = -lreadline

test: test.o
    g++ $(CFLAGS) $< $(LDFLAGS) -o $@

test.o: test.cpp Makefile
    g++ $(CFLAGS) -c $<

TEST.CPP:

#include <fnmatch.h>
#include <readline/readline.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

static double time()
{
    timespec    ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    return ts.tv_sec + (1e-9 * (double)ts.tv_nsec);
}


static void time_fnmatch()
{
    for (int i = 0; i < 2; i++)
    {
        double t = time();
        for (int i = 0; i < 1000000; i++)
        {
            fnmatch("*.o", "testfile", FNM_PERIOD);
        }
        fprintf(stderr, "%f\n", time()-t);
    }
}

int main()
{
    time_fnmatch();

    char *input = readline("> ");
    free(input);

    time_fnmatch();
}

输出:

0.045371
0.044537
> 
0.185246
0.181607

在调用readline()之前,fnmatch调用的速度提高了大约4倍。虽然 这种性能差异令人担忧,我最感兴趣的是找出答案 readline()调用究竟对程序状态执行了什么操作 会对其他库调用产生这种影响。

1 个答案:

答案 0 :(得分:4)

只是猜测:readline初始化可能会调用setlocale

程序启动时,它位于C区域设置中;对setlocale(LC_ALL, "")的调用将启用默认语言环境,而现在,默认语言环境通常使用UTF-8,在这种情况下,许多字符串操作变得更加复杂。 (即使只是迭代字符串。)