【发布时间】:2022-11-22 06:13:48
【问题描述】:
我有一个问题。
我终于找到了一种使用外部库来求解我的数值系统的方法。该库会自动打印矩阵。倒入 dim=5 没问题,但是对于 dim=1.000.000,你就明白问题所在了……
那些寄生的“printf”大大减慢了执行速度,我想摆脱它们。问题是:我不知道他们在哪里!我查看了图书馆中的每个“.H”和“.C”文件:无处可寻。
我怀疑它们已经包含在库本身中:superlu.so。因此,我无法访问它们。
我怎么可能阻止我的 C 代码在执行期间打印任何内容?
这是我的生成文件。我使用直接从 Ubuntu 下载的 libsuperlu-dev 库。 .so 文件已经存在。
LIB = libsuperlu.so
main: superlu.o read_file.o main.o sample_arrays.o super_csr.o
cc $^ -o $@ $(LIB)
clean:
rm *.o
rm main
【问题讨论】:
-
有点 hacky,但您可以将所有输出重定向到 /dev/null。
-
LD_PRELOAD并删除对printf的调用,这样它们就不会打印。或者修改二进制文件并删除对它的所有调用。修补它。或者自己建造? github.com/xiaoyeli/superlu -
@WillisHershey,将输出重定向到
/dev/null不会避免全部打印的开销,但它通常确实避免了很大一部分开销。输出到交互式设备通常是尤其减缓。 -
@WillisHershey 试试看。编写一个调用
printf("hello, world\n")一百万次的程序,然后调用fprintf(stderr, "bye\n")一次。在将 stdout 重定向到/dev/null和不重定向到/dev/null的情况下运行它,然后自己看看区别。 -
不管怎样,第一步通常是查阅文档,而不是搜索代码。如果计算库确实是不需要的诊断消息的来源,那么我完全希望有一种方法可以通过编程将它们关闭,而不是通过修改库源或玩动态链接器游戏甚至使用 I/O 重定向。