如果整个项目的优化都关闭了,我如何才能只优化一个功能



我从事的一个大型项目禁用了优化。绝大多数开发人员更喜欢这种方式,因为我们的项目无论如何都是I/O绑定的,这使得转储分析更容易。最近,我开始考虑用std::format替换我们基于printf的跟踪机制。然而,有一个问题,在我的评测中,std::format在启用优化时比我们当前的跟踪快,但在禁用优化时慢了2000%以上。使用它实际上会显著降低性能。

这让我想知道我是否可以只为一个函数或一个静态库打开优化。然而,我正在努力想办法。问题是,std::format的性质意味着,为使用它而编写的任何跟踪函数都必须转发模板参数,因此必须是模板本身。例如:

template<typename... Args>
void Trace(std::_Fmt_wstring<Args& ...> fmt, Args& ...args)
{
wchar_t buf[0x1000];
std::format_to(buf, fmt, args...);
// Pass the buffer to the tracing framework
}

因为它是一个模板,它是基于头的,我不能把编译的跟踪代码放在静态库中。它将在调用它的未优化代码中被实例化。

如何优化此功能?我尝试过#pragma optimize,但它没有帮助,因为我不仅需要优化函数本身,还需要优化std::format_to生成的代码。

有什么想法吗?

绝大多数开发人员都喜欢这种方式,因为我们的项目无论如何都是I/O绑定的,它使转储分析更容易

这就是/Zo标志的发明目的。它使调试零售代码变得更加容易。不完美,但比没有它要好得多。

您提到的一个挑战是它们是模板函数。您可以尝试用自己的头来包装库头,这些头声明您使用的特定专业化为extern(以防止在使用模板时隐式实例化模板(,然后创建一个静态库,在其中实例化这些专业化,并使用您想要的任何优化级别编译静态库(我对MSVC不太熟悉,但您可能需要检查静态库中链接的运行库和您自己编译的二进制文件是否有任何兼容性需求(。然后在您的项目中,包含库头的封装版本和针对静态库的链接。

使用extern模板是我从Daniele Pallastrelli的这篇博客文章中学到的,该文章使用了避免在多个翻译单元中重复模板实例化的技术来减少编译时间。

最新更新