以下程序说明了这个问题:
生成文件:
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()调用究竟对程序状态执行了什么操作 会对其他库调用产生这种影响。
答案 0 :(得分:4)
只是猜测:readline
初始化可能会调用setlocale
。
程序启动时,它位于C
区域设置中;对setlocale(LC_ALL, "")
的调用将启用默认语言环境,而现在,默认语言环境通常使用UTF-8,在这种情况下,许多字符串操作变得更加复杂。 (即使只是迭代字符串。)