インライン関数ってどれだけ早いの??
インライン関数ってどれだけ早いの?
インライン関数がどれだけ早いのか気になったので、調べた。
コード
#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化しても競技プログラミングの実行時間内では差がほとんどない。