strchrとC++ stringのfindの速度差
find
void find(std::string &a) { for(int k = 0; k < 1000; k++){ a.find('b'); } } int main(void){ std::string a; a.reserve(10000000); for(int j = 0; j < 1000; j++){ for(int i = 0; i < 10000; i++){ a[i + j * 10000] = 'a'; } a[j * 10000] = 'b'; } for(int l = 0; l < 1000; l++){ find(a); } }
strchr
void find(const char* a) { for(int k = 0; k < 1000; k++){ strchr(a, 'b'); } } int main(void){ char *str; str = (char *) malloc(sizeof(char)*10000000); str[1] = 'b'; for(int j = 0; j < 1000; j++){ for(int i = 0; i < 10000; i++){ str[i + j * 10000] = 'a'; } str[j * 10000] = 'b'; } for(int l = 0; l < 1000; l++){ find(str); } free(str); }
で速度比較を行った。
strchr real 0m0.133s user 0m0.111s sys 0m0.021s find real 0m0.192s user 0m0.173s sys 0m0.019s
だいたい1.5倍かな?
ただ、文字列の構築に時間がかかっている可能性もあるので、一概に比較できないのが残念なところ。
プロファイラを取ったんだが、macだとC++のシンボル名がデマングルされないみたいです。
これ、なんとかできないかなぁ?
ちなみにコンパイラはどちらもg++で、最適化オプションはなしです。