【问题标题】:boost unit test templates produces bloated code. How to avoid that?boost 单元测试模板会产生臃肿的代码。如何避免这种情况?
【发布时间】:2011-05-15 23:25:57
【问题描述】:

我使用 boost 单元测试库完成了大约一百个简单的测试。不仅编译时间很长(大约半分钟),而且生成的可执行文件的大小也变得非常大——仅仅一百个简单的测试就达到了 4MB。如果在没有使用 boost 测试的情况下完成测试,则可执行文件大小仅为 120kB。

我怎样才能减轻臃肿?这个问题只是因为兴趣,而不是我需要测试代码才能有闪亮的性能:)

调试信息已被剥离。我已经尝试了所有优化选项,但没有成功。

编辑

每个测试基本如下:

PlainOldDataObject a, b;

a = { ... initial_data ... };
a = some_simple_operation(a);
b = { ... expected_result ... };
BOOST_CHECK(std::memcmp(&a, &b, sizeof(PlainOldDataObject)) == 0);

【问题讨论】:

  • 也许您可以包含您正在谈论的内容的 sn-p。目前,只有真正经历过您所描述的事情的人才能做出回应。我可能会大胆猜测您可以合并一些 *.cpp(翻译单元)并禁用内联(gcc 上的-Os -fno-inline
  • 您知道,许多人将 boost 用作 C++ 的圣杯,但它产生看似不合理的膨胀的次数比您预期的要多。以 boost::serialization 为例:P
  • kizzx2:是的,在进一步检查预处理源和生成的程序集之后,我相当肯定 boost 单元测试框架只是设计错误,因为每次测试都会生成大量代码。必须可以将大部分代码放入单独的函数中。

标签: c++ templates boost


【解决方案1】:

我。您采用哪种用法变体?如果您使用单元测试框架的单头变体,则应切换到离线变体(静态或动态)

二。如果您怀疑 BOOST_AUTO_TEST_CASE 宏有问题,您有几种选择:

  1. 放弃每个测试用例策略的单个断言并使用“主题”测试用例的数量。我个人认为这是可以接受的。

  2. 使用手动测试用例注册。您可能可以使用自己的宏将其自动化,以避免繁琐的重复。

  3. 拆分成多个测试文件。您可能会看到至少一些编译时间改进(或者可能不会)。

三。如果您怀疑 BOOST_CHECK 语句,那么您无能为力,但看到它们的开销如此之大,我会感到相当惊讶。也许你应该进一步调查。

【讨论】:

    【解决方案2】:

    尝试改用Loki library:它还有许多常用的通用组件(包括静态断言宏,类似于 BOOST_CHECK)。

    Loki 以轻量级而著称,但比 boost 更强大,因为它使用基于策略的类设计方法。然而,它没有那么多种类的工具,只有最常见的工具:智能指针、小对象分配器、元编程助手、工厂和其他一些工具。但是,如果您不需要任何像 ex 序列化这样可怕的 boost 库,您可能会发现它可以满足您的需求。

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多