我已经做了一些搜索,但没有找到任何可以增强Visual Studio VS2010 C(不是C ++)中的文件和格式化功能的东西。 我已经能够通过使用大缓冲区和SSD驱动器在一定程度上解决原始i / o问题,因此更紧迫的问题是替换printf函数系列。 有人找到了值得的东西吗?
据我了解,printf函数的部分冰川速度问题是它们必须处理各种类型的参数。有没有人有编写特定数据类型的printf的经验;例如,只打印一次,或只打印双打等?
答案 0 :(得分:1)
首先,你应该在假设它是printf之前先对代码进行分析。
但是如果你确定它是printf和类似的那么你可以做一些事情来解决这个问题。
1)打印较少。 IE,如果可以避免,请不要拨打昂贵的操作。例如,您需要 all 输出吗?
2)手动将字符串连接替换为完成所有部分的手动构建的例程,而不必解析格式说明符。
EG: printf("--%s--", "really cool");
可以成为:
write(1, "--", 2);
write(1, "really cool", 11);
write(1, "--", 2);
可能更快。但同样,在你描述它之前你不会知道。不要在解决方案上花费精力,直到您能够确认它是您需要的解决方案,并能够衡量您提出的解决方案是否成功。
答案 1 :(得分:0)
@Wes是对的,在你有证据之前,永远不要假设你知道你需要修复什么。 我不同的是找出方法。 我和其他人使用适用于 random pausing 的 these reasons ,以及 here's 的简短幻灯片演示&安培; C ++代码,以便您可以查看它是如何工作的。
关于printf(或任何输出)函数的事情是它花费A)一定数量的CPU周期创建一个要输出的缓冲区,然后它花费B)一定的时间等待系统和/或辅助硬件实际上会将数据移出。
这可能有点过于简单,但如果你随机暂停并检查状态,那就是你所看到的。 你通过使用大缓冲区和SSD驱动器所做的就是减少B,这很好。 这意味着剩下的时间,A是一个更大的部分。 你知道的。
现在您在A中找到的样本,如果您看到printf中的哪些从属例程正在显示,您可能会得到一些暗示。
通常printf调用像vprintf
之类的东西去除变量参数列表,然后循环遍历格式字符串以找出要做的事情,包括解析精度说明符之类的事情。
如果看起来就像它正在做的那样,那么你知道解析格式需要多少时间。
另一方面,如果您在复制字符串的例程中看到它,或者格式化整数(以及处理前导/尾随字符等),那么您就会专注于此。
另一方面,如果你在一个看起来像是在格式化浮点数的例程中看到它(实际上非常复杂),你就会专注于那个。
考虑到这一切,你想知道我做了什么? 首先,我问谁还会读这个? 如果没有人真的需要阅读所有这些文本,为什么不把它用二进制文件?或者失败了,用十六进制? 如果你只是写二进制文件,A缩小为空,当你用另一个程序读回来时,猜猜是什么? No Lost Bits!