gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:24 27 4
gpt4 key购买 nike

下面的程序说明了这个问题:

生成文件:

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

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

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

测试.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() 调用可能会对程序状态执行什么操作会对其他库调用产生这种影响。

最佳答案

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

当程序启动时,它是在 C 语言环境中;调用 setlocale(LC_ALL, "") 将启用默认语言环境,如今,默认语言环境通常使用 UTF-8,在这种情况下,许多字符串操作变得更加复杂。 (即使只是遍历一个字符串。)

关于c++ - 为什么第一次调用 readline() 会减慢对 fnmatch() 的所有后续调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25457569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com