Isa@Diary

ソフトウェア開発やってます。プログラミングとか、US生活とかについて書きます。

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

と差がなくなる。

結論

割とどっちでもいいっぽい。