为什么长度为23的子字符串比clang中长度为22的子字符串长5倍?

时间:2018-04-12 02:55:09

标签: c++ clang++

on clang version 5.0.1以下代码

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
    string str = "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < 5000000; i++) {
        str.substr(4);
    }

    return 0;
}

给我以下时间

real    0m0.104s
user    0m0.096s
sys     0m0.002s

现在,如果我更改了str.substr(3),我最终会得到以下时间

real    0m0.478s
user    0m0.468s
sys     0m0.003s

据我所知,gcc不会受此影响。任何人都可以解释这里可能存在的问题吗?

编辑:

更重要的是,是否有人可能会建议如何避免这种巨大的性能损失?

EDIT2:

这似乎是某种短字符串优化技巧,特别是自22 is magic number in that context以后。

0 个答案:

没有答案