我正在编写一个程序,性能很重要但不是至关重要。当前,我正从一个FILE*
逐行读取文本,并使用fgets
获取每一行。经过一些性能工具的测试,我发现我的应用程序在运行时有20%到30%的时间处于fgets
内。
有更快的方法来获取一行文本吗? 我的应用程序是单线程的,没有使用多个线程的意图。输入可能来自stdin或文件。提前感谢您的帮助。
我正在编写一个程序,性能很重要但不是至关重要。当前,我正从一个FILE*
逐行读取文本,并使用fgets
获取每一行。经过一些性能工具的测试,我发现我的应用程序在运行时有20%到30%的时间处于fgets
内。
有更快的方法来获取一行文本吗? 我的应用程序是单线程的,没有使用多个线程的意图。输入可能来自stdin或文件。提前感谢您的帮助。
你没有说明你所在的平台,但如果是类UNIX系统,那么你可以尝试使用read()系统调用,它不会执行fgets()等函数所做的额外缓冲层。这可能会略微加快速度,另一方面也可能会减慢速度——唯一的办法就是尝试并查看结果。
fgets()
快得多(近4倍)。 - dreamlax使用fgets_unlocked()函数,但请先仔细阅读其说明
使用fgetc()或fgetc_unlocked()函数获取数据,而不是使用fgets()函数。使用fgets()函数会导致数据被复制到内存两次:首先由C运行时库从文件中复制到一个内部缓冲区(流I/O是缓冲的),然后从该内部缓冲区复制到程序中的数组。
一次性将整个文件读入缓冲区。
从该缓冲区处理行。
这是最快的解决方案。
根据您的环境,使用setvbuf()来增加文件流使用的内部缓冲区大小可能会或可能不会提高性能。
下面是语法 -
setvbuf (InputFile, NULL, _IOFBF, BUFFER_SIZE);
输入文件InputFile是一个使用fopen()函数刚打开的FILE*文件指针,BUFFER_SIZE是缓冲区大小(由此调用为您分配)。
您可以尝试不同的缓冲区大小,以查看是否有任何积极影响。请注意,这完全是可选的,您的运行时可能根本不使用此调用。
start asynchronous read
loop:
wait for asynchronous read to complete
if end of file goto exit
start asynchronous read
do stuff with data read from file
goto loop
exit: