現代の量子力学

主に精進の様子を記録する日記帳です

インライン関数ってどれだけ早いの??

インライン関数ってどれだけ早いの?

インライン関数がどれだけ早いのか気になったので、調べた。

コード

#include<iostream>
#include<chrono>
#include<vector>
using namespace std;
template<class T>inline int inline_sz(T &a) { return a.size(); }
template<class T>int sz(T &a) { return a.size(); }

using ll = long long;

inline int fin(int a) {
  return a;
}
int f(int a) {
  return a;
}

double clock(ll N) {
  chrono::system_clock::time_point start,end;
  start = chrono::system_clock::now();

  for (int i = 0; i < N; ++i) {
    f(i);
  }

  end = chrono::system_clock::now();
  auto elapsed = chrono::duration_cast< chrono::microseconds >(end - start).count();
  double y = elapsed;
  y /= 1000;  
  return y;
}
double inline_clock(ll N) {
  chrono::system_clock::time_point start,end;
  start = chrono::system_clock::now();

  for (int i = 0; i < N; ++i) {
    fin(i);
  }
 
  end = chrono::system_clock::now();
  auto elapsed = chrono::duration_cast< chrono::microseconds >(end - start).count();
  double y = elapsed;
  y /= 1000;
  return y;
}

int main()
{
  ll N = 1e+9;
  
  double cl = 0;
  int M = 1;
  for (int i = 0; i < M; ++i) {
    cl += clock(N);
  }
  printf("w/o inline : %.7f[ms]\n", (double)cl/M);
  double incl = 0;
  for (int i = 0; i < M; ++i) {
    incl += inline_clock(N);
  }
  printf("w/  inline : %.7f[ms]\n", (double)incl/M);  
  return 0;
}

結果

w/o inline : 2331.5940000[ms]
w/  inline : 2075.2720000[ms]

109 回 引数を返すだけの簡単な関数を呼び出すと、 inlineの方が早い。

参照渡しにしてみた

inline int fin(int &a) {
  return a;
}
int f(int &a) {
  return a;
}

結果

w/o inline : 2083.8500000[ms]
w/  inline : 2091.7830000[ms]

参照渡しにすればinlineにしてもほとんど変わらない。(本当に?)

どのくらいの長さの関数だったらinlineにすべきか?

inline int fin(int a) {
  for (int i = 0; i < 1; ++i) {
    a += i;
  }
  return a;
}
int f(int a) {
  for (int i = 0; i < 1; ++i) {
    a += i;
  }
  return a;
}

ちょっと関数を長くしてみた(なにこの関数)。

結果

w/o inline : 3191.2370000[ms]
w/  inline : 4289.5910000[ms]

ほんのちょっと長くなっただけなのに結構遅くなった。

結論

inline化しても競技プログラミングの実行時間内では差がほとんどない。