i++と++i,it++と++it
はじめに
前置インクリメントと後置インクリメント、どちらでもいい状況なら後者、みたいなのを
たまに見かけるし、理屈は解るけど実際どうなるのか気になったのでちょっと試してみた。
(結構適当な計測です、指摘があればしていただけると嬉しいです)
intの場合
i++.cpp
#include <iostream> using namespace std; int main(){ volatile int hoge; for(int i=0;i<10;i++){ hoge = i; } return 0; }
これと、forの最後を++iにした++i.cppを
[isa@localhost etc]$ g++ --version g++ (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1) Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [isa@localhost etc]$ g++ -S -O0 ++i.cpp [isa@localhost etc]$ g++ -S -O0 i++.cpp [isa@localhost etc]$ diff ++i.s i++.s 1c1 < .file "++i.cpp" --- > .file "i++.cpp"
これだと吐くコードに差はないらしい。
ちなみに
#include <iostream> using namespace std; int main(){ volatile int hoge,i; while(i<10){ i++; } return 0; }
でも同じだった。
iteratorの場合
it++.cpp
#include <map> using namespace std; int main(){ map<int,int> m; for(int i=0;i<1000000;i++){ m[i] = i; } map<int,int>::iterator it; for(int i=0;i<100;i++){ it = m.begin(); while(it != m.end()){ it++; } } return 0; }
とwhile内を++itにしたものを同じようにg++ -S -O0でアセンブリを吐かせてみると
吐くコードが違う。
実行時間(timeのuser時間,CPUは Intel(R) Atom(TM) CPU N270 @ 1.60GHz)は-O0で
mapへの追加のみ(10^6個):3.952s ++it(10^6個の走査を10^2回):13.610.sec it++(10^6個の走査を10^2回):14.232.sec
だった。10^8回ぐらいで0.5秒ぐらいの差がある。
ただし、-O2にすると
mapへの追加のみ(10^6個):1.303s ++it(10^6個の走査を10^2回):4.403sec it++(10^6個の走査を10^2回):4.393.sec
と差がなくなる。
結論
割とどっちでもいいっぽい。