【发布时间】:2014-02-18 19:30:47
【问题描述】:
我正在考虑编写一个函数来估计至少来自 sprintf()、snprintf() 函数的格式化字符串的全长。
我的方法是解析格式字符串以找到各种 %s、%d、%f、%p 参数,创建 strlen()s、itoa()s 和 strlen(format_string) 的运行总和以得到保证足够大的东西可以为 snprintf() 分配适当的缓冲区。
我知道以下工作,但它需要 10 倍的时间,因为所有 printf() 函数都非常灵活,但如果它的话,速度会很慢。
char c;
int required_buffer_size = snprintf(&c, 1, "format string", args...);
这已经完成了吗? - 通过建议的方法或其他一些相当有效的方法 - IE:比 sprintf() 变体快 5-50 倍?
【问题讨论】:
-
花费“10 倍的时间”究竟是什么?您描述的功能必须再次实现 snprintf 才能正确,除非您愿意将其限制为格式说明符的子集......这是您想出更快替代方案的唯一方法。跨度>
-
@vanza,你能证明你的主张吗?我可以少做很多工作,比如使用长度为 12 的 int32_t、24 的 int64_t、80 的 %f 等。我已经有 5-10X 用于处理字符串。我会 RX 基准测试 snprintf()。所有 printf() 变体都非常慢。有时它们是唯一正确的解决方案,但这不是其中之一。
-
@JosephQuinsey,这正是我正在寻找的那种链接。非常感谢!!!
-
注意:像“12 for an int32_t”这样的值是一个好方法。我发现
char[sizeof(some_int_type)*3 + 3]效果很好。但是%f确实有一个令人讨厌的最坏情况。使用典型的双精度,大约 320 字节。当然——你可能已经知道了。
标签: c