【问题标题】:Prevent my C code from printing (seriously slows down the execution)阻止我的 C 代码打印(严重减慢执行速度)
【发布时间】: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 重定向。

标签: c ubuntu printing solver


【解决方案1】:

只是为了解释所提到的 LD_PRELOAD 方法,我有时会精确地使用它(或者相反地添加一些 printf,例如,当我想通过管道传输 GUI 的输出时),这就是你的方法可以做它的基本版本

我的打印.c:

int printf(char *, ...){
    return 0;
}

int putchar(int){
    return 0;
}

然后

gcc -shared -std=gnu99 -o myprint.so myprint.c

然后

LD_PRELOAD=./myprint.so ./main

在任何其他库有机会强制加载它们之前强制加载您的 printfputchar 符号。因此,不会发生打印。至少没有 printf。但是您可能必须向列表中添加一些其他功能,例如fprintffputcfputsputs、...

当然,重载 fthing 函数(甚至可能是其他函数)的另一个问题是,您可能还会阻止某些想要的行为。比如写文件。或者与某些设备交互。

如果这些打印是使用低级别的write函数完成的,情况可能会更糟。那个,你很可能负担不起重载(除非你用调用真正的write的函数重载它,由dlopen手动加载)根据目标文件描述符只过滤你想避免的那些(1) 或书面数据的内容。

注意:如果你想验证libsuperlu.so是否负责这些打印,你可以检查nm libsuperlu.so是否指的是一些众所周知的打印功能,例如printf

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2012-05-16
    • 2014-01-30
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多