繁体   English   中英

使用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\\n"); 1,000,000次。 然后我为BIO_printf(fp, "Hey\\n"); 我只给BIO_printf()语句计时,而不给文件指针设置时间(这会增加时间)。 区别在于,printf()比使用BIO_printf()快约4.7倍。

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

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

您可以拥有一个写入文件的BIO,或者为null,或者是一个套接字,或者是网络驱动器,或者是另一个BIO等。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM