読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

Type Erasureと仮想関数

前回書いたType Erasureのコードと同等の仮想関数を使ったコードで速度を比較してみました。

// 比較コード
#include <iostream>
#include <memory>
#include <vector>
#include <boost/timer.hpp>

struct base {
  virtual void draw() const = 0;
};

struct circle : public base {
  virtual void draw() const {
    std::cout << "○" << std::endl;
  }
};

struct triangle : public base {
  virtual void draw() const {
    std::cout << "△" << std::endl;
  }
};

struct square : public base {
  virtual void draw() const {
    std::cout << "□" << std::endl;
  }
};
*/

int main() {
  boost::timer timer;
  std::vector<std::shared_ptr<base>> v;
  pstade::oven::for_each(boost::irange(0, 10000), [&v](int) {
    v.push_back(std::make_shared<circle>());
    v.push_back(std::make_shared<triangle>());
    v.push_back(std::make_shared<square>());
  });
  pstade::oven::for_each(v, [](const std::shared_ptr<base> &x) {
    x->draw();
  });
  std::cout << timer.elapsed() << std::endl;
  return 0;
}

// 前回のコードも測定用にboost::timerを入れたり10000回ループを同等に加える

結果はどちらも5秒前後でした。まぁType Erasureの方にもコンテナにぶちこむ都合上std::shared_ptrを使ってしまっているのでそこらへんであまり差がなくなってしまっているのかなとか思ったりしています。
一つ分かったことは、10000回ループするfor文は遅いかもしれないということです。測定用のコードでは、boost::irangeとpstade::oven::for_eachで10000回ループを実施していますが、for文で試しに書いて測定したところ、6秒位かかってました。