关于C#:使用BIO_printf()代替printf()有什么好处?

What are the benefits to using BIO_printf() instead of printf()?

我一直在审查使用OpenSSL的示例代码,在我找到的每个示例中,创建者都选择使用BIO_printf()将内容写到stdout而不是printf()。

我已经获取了他们的代码,删除了openssl / bio.h标头声明,并将对BIO_printf()的所有调用更改为常规的printf()语句。程序以相同的结果运行。

我要解决的问题是,为什么这些编码员在设置时要比使用printf()花费更多的时间来使用BIO_printf()。您必须包括另一个标头(这将增加程序大小),您需要将文件指针设置为要写入的流。然后,您可以将您的消息打印到stdout。似乎比使用printf()要复杂得多。

当我在BIO_printf()上进行搜索时,它会列出BIO_printf(3)的可能的手册页,但实际上这些页面均未包含任何信息!

我决定对这两种方法进行基准测试。我循环printf("Hey\
");
1,000,000次。然后我做了BIO_printf(fp,"Hey\
");
。我只给BIO_printf()语句计时,而不给文件指针设置时间(这会增加时间)。区别在于printf()比使用BIO_printf()快约4.7倍。

为什么要使用它?有什么好处?据我了解,在编程中您要么希望代码简单或高效,就BIO_printf()而言,两者都不是。


通常,BIO可能不会写入stdout。

您可以拥有一个BIO,该BIO可以写入文件,为null,套接字,网络驱动器或其他BIO等。

通过使用BIO_printf系列,可以轻松地更改代码,以将其输出发送到其他位置或另一个BIO,后者可以进行进一步的过滤,然后将输出传递到其他任何地方。


正如其他人所指出的,BIO可以与FILE相反地堆叠。在C99中添加了snprintf()vnsprintf()。 OpenSSL / SSLeay早于此。因此,SSLeay开发人员必须编写自己的实现。不幸的是,很少使用实现会导致OP或CVE-2016-0799所描述的性能问题。