我目前正在研究一个小的bash脚本,它读取源C文件,然后找到相应的包含文件。
现在我必须在寻找映射M的两种模型中进行选择:文件名 - > {包含文件路径}。我有两个数组 - 一个包含文件名,另一个包含可能的路径。选项包括:
a)在一条路径中查找每个文件,然后继续前进到另一条路径;
b)查看路径列表以查找一个文件,然后继续查看另一个文件。
我的问题是 - 什么会更快?每个选项中的迭代次数相同,但是某些命令可能更耗时?我个人更喜欢选项a)。
感谢您的帮助,如果这是一个愚蠢的问题,请抱歉。
答案 0 :(得分:1)
只有在编码严重时才会进行相同数量的迭代,一旦找到匹配就不使用continue
关键字(不要忘记它也可以将数字作为参数来影响外部循环)。
我将迭代所有包含文件并查看带有一些排序的路径 - <system>
包括搜索系统首先包含路径以获得更快的结果,而"local"
包含的情况也是如此。解析时丢弃此信息是不明智的。
但是,我认为只需在所有包含路径上运行find -type f
并将结果存储在临时文件或变量中,就可以做得更好。那么你只需要grep
(或任何等价物)来包含它们自己。这样就节省了一些I / O,因为有一半是一次性读取而只有一次。
答案 1 :(得分:1)
你应该做什么取决于你的目标,我不太明白。如果您要创建make
文件,您可能应该使用makedepend,如前面的答案所述。
如果您想知道系统上是否有多个版本的头文件,请考虑使用locate
命令。例如,在我的ubuntu 12.04 linux系统上,以下命令需要大约一秒钟才能完成,并产生命令下方显示的输出。
$ locate stdio.h | grep usr/include
/usr/include/stdio.h
/usr/include/c++/4.6/tr1/stdio.h
/usr/include/glib-2.0/glib/gstdio.h
/usr/include/sharutils/stdio.h
/usr/include/x86_64-linux-gnu/bits/stdio.h
如果文件pqr的单独行上有库路径列表,文件xyz中有头文件列表,则可以使用
这样的命令 locate / | grep -f xyz | grep -f pqr
(注意,-F
可以与-f
一起使用,如果您愿意的话。)在stdio.h
中有两行(stdlib.h
和xyz
),在/usr/include/
中有两行(/usr/lib/
和pqr
),该命令在我的系统上占用.7秒,以产生输出
/usr/include/stdio.h
/usr/include/stdlib.h
/usr/include/c++/4.6/tr1/stdio.h
/usr/include/c++/4.6/tr1/stdlib.h
/usr/include/freetype2/freetype/config/ftstdlib.h
/usr/include/glib-2.0/glib/gstdio.h
/usr/include/sharutils/stdio.h
/usr/include/sharutils/stdlib.h
/usr/include/x86_64-linux-gnu/bits/stdio.h
/usr/include/x86_64-linux-gnu/bits/stdlib.h
/usr/lib/perl/5.14.2/CORE/nostdio.h
/usr/lib/syslinux/com32/include/stdio.h
/usr/lib/syslinux/com32/include/stdlib.h
注意,在典型的Linux系统上,文件名数据库每天更新一次。在查找系统头文件时,这可能不会成为问题。对于更具瞬态性的文件,您可能需要在使用sudo updatedb
之前说出locate
,这会在几分钟到整个时间内添加几秒钟。
答案 2 :(得分:0)
要查找包含文件,专用解决方案将为makedepend,特别是如果您仍在使用makefile。