gpt4 book ai didi

c++ - 方括号[]和括号()之间的 Armadillo 库区别

转载 作者:行者123 更新时间:2023-12-02 10:13:59 27 4
gpt4 key购买 nike

Armadillo库为element access提供了3种方法:

  • 通过();
  • 通过[];
  • 通过at();

  • 我注意到在使用每种工具时,性能都有差异。我测试了以下代码:
    size_t n_row = 500, n_col = 500;

    { // ()
    wall_clock timer;
    mat matrix(n_row, n_col, fill::zeros);
    timer.tic();
    for (size_t i = 0; i < n_row; i++){
    for (size_t j = 0; j < n_col; j++){
    matrix(i, j) = i+j;
    }
    }
    std::cout << timer.toc() << std::endl;
    }

    { // []
    wall_clock timer;
    mat matrix(n_row, n_col, fill::zeros);
    timer.tic();
    for (size_t i = 0; i < n_row; i++){
    for (size_t j = 0; j < n_col; j++){
    matrix[i, j] = i+j;
    }
    }
    std::cout << timer.toc() << std::endl;
    }

    { // .at()
    wall_clock timer;
    mat matrix(n_row, n_col, fill::zeros);
    timer.tic();
    for (size_t i = 0; i < n_row; i++){
    for (size_t j = 0; j < n_col; j++){
    matrix.at(i, j) = i+j;
    }
    }
    std::cout << timer.toc() << std::endl;
    }
    结果是:
  • 通过() 0.0008秒;
  • 通过[] 0.0003秒;
  • 通过at() 0.0007秒;

  • 任何人都可以评论给定的结果吗?
    我使用Windows 10 x64,MSVC 2017, Release模式,Qt 5.14.2
    我在 #define ARMA_NO_DEBUG中设置了 config.hpp

    最佳答案

    答案主要在您提供的链接中:

  • .at(n)[n]与(n)一样,但没有边界检查。除非代码经过彻底调试,否则不建议使用。
  • 因此,答案的第一部分是.at(n)[n]的速度可能比(n)稍快,但安全性较弱,这也许就是为什么()访问在测试中花费时间最长的原因。
  • 但是[n].at(n)是相同的,并且您看到的时间差异与运行或定时测试的方式相同。这并不奇怪,因为基准测试非常困难,这不仅仅是在您执行操作时以一定的时间循环运行某些内容的问题。 (实际上,这甚至可能是您使用()看到的时差的真正原因。)
  • 此约定与STL容器令人困惑地不同:通常不选中[]并检查.at(),而根本不存在用于索引的()

  • 也有(i,j).at(i,j)以及(i,j,k).at(i,j,k),但没有[i,j][i,j,k]
  • 因此,.at()[]似乎重复存在的原因是[]不能用于多个索引(但是对于一索引的情况仍然可用,因为它比.at()更为自然)。
  • 链接中未提及,但这是因为C++不允许使用多个参数重载operator[]函数,因此,它最终总是会被解释为[(i,j)],最终会被评估为[i]-会对j进行评估(例如,对其进行评估)是一个函数调用),但随后被丢弃!


  • 实际上,检查索引访问在大多数应用程序中极不可能成为瓶颈,并且在许多情况下,无论如何编译器都可能对其进行了完全优化(至少在 Release模式下如此)。因此,我的建议是始终使用圆括号 mat(ind)表示法。

    关于c++ - 方括号[]和括号()之间的 Armadillo 库区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62575730/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com