Может ли компилятор переупорядочить код по вызовам std :: chrono :: system_clock :: now ()? - PullRequest
6 голосов
/ 15 марта 2012

Во время игры с бета-версией VS11 я заметил кое-что странное: этот код обрабатывает

f, который занимает 0 миллисекунд

int main()
{
    std::vector<int> v;
    size_t length =64*1024*1024;
    for (int i = 0; i < length; i++)
    {
        v.push_back(rand());
    }

    uint64_t sum=0;
    auto t1 = std::chrono::system_clock::now();
    for (size_t i=0;i<v.size();++i)
        sum+=v[i];
    //std::cout << sum << std::endl;
    auto t2 = std::chrono::system_clock::now();
    std::cout << "f() took "
        << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
              << " milliseconds\n";


}

Но когда я решаю раскомментировать строку сcouting суммы, тогда это выводит разумное число.

Это поведение, которое я получаю с включенными оптимизациями, с их отключенными, я получаю "нормальный" cout

f () взял471 миллисекунда

Так это стандартное поведение?Важно: дело не в том, что мертвый код оптимизируется, я вижу задержку при запуске из консоли, и я вижу скачок ЦП в диспетчере задач.

1 Ответ

9 голосов
/ 15 марта 2012

Я предполагаю, что это - это оптимизация мертвого кода - и что ваш скачок нагрузки связан с работой по инициализации вектора не оптимизируется , а вычисление вашего неиспользованная sum переменная является .

Но когда я решаю раскомментировать строку с указанием суммы, она выводит разумное число.

Это согласуется с моей теорией, да - когда вы вынуждены использовать результат вычисления, само вычисление не может быть оптимизировано.

Если вы хотите подтвердить это дальше, заставьте вашу программу сказать, когда она будет готова, и сделайте паузу, чтобы вы нажали return - это позволит вам подождать, пока любой скачок ЦП явно «пропадет», прежде чем вы нажмете return, что даст у вас больше уверенности в том, что его вызывает.

...