用于性能的原生循环?

主要观点:作者加入新项目后对代码中的原始循环进行改进,用std::ranges::transform替代原始循环,探讨了此改进带来的影响,如避免修改向量、减少特殊成员函数调用等,同时进行了基准测试,发现增强的原始循环版本在 Clang 上比原始循环版本快约 20%,GCC 上原始循环版本快约 10%,push_back版本比其他两个版本慢 20 - 30%,结论是使用范围或算法比原始循环有可读性等优势,但纯粹性能不一定是优势,具体使用哪种版本取决于实际情况。

关键信息:

  • 作者看到代码中的原始循环后用std::ranges::transform进行替换。
  • 讨论了transformed_data变为视图后填充response.data时是否复制元素的问题。
  • 分别给出了使用原始循环、std::ranges::transformemplace_back的代码及输出。
  • 基于 Quick Bench 的基准测试结果显示不同版本的性能差异。
  • 强调要根据实际情况选择使用版本,不能盲目追求性能或可读性。

重要细节:

  • 示例代码中包含多个结构体和函数,如FromDataWidgetToDataResponse等。
  • 代码中对ToData的构造函数、拷贝构造函数、移动构造函数和赋值运算符重载进行了定义。
  • 基准测试结果显示不同编译器下各版本的性能差异情况。
  • 提到 C++23 中可以使用std::ranges::to<std::vector<Todata>>构造最终的vector,但对特殊成员函数调用次数无影响。
阅读 10
0 条评论