2016-09-12 5 views
4

Я запускал простой тест для синхронизации кода на C++, и я столкнулся с артефактом, на котором я не на 100% положителен.Разница между временем Linux и рабочими часами в коде

Настройка

Мой код использует C++ 11 high_resolution_clock для измерения затраченного времени. Я также завершаю выполнение моей программы с помощью команды Linux time (/usr/bin/time). Для моей программы high_resolution_clock сообщает ~ 2s, а time сообщает ~ 7s (~ 6.5s пользователь и ~ .5s система). Кроме того, используя подробный вариант во времени показывает, что моя программа использовала 100% CPU с 1 добровольным переключателем контекста и 10 непроизвольными контекстными переключателями (/usr/bin/time -v).

Вопрос

Мой вопрос: что вызывает такое резкое различие между измерениями времени ОС и времени измерений производительности?

Мои первые мысли

Через мое знание операционных систем, я предполагаю, что эти различия являются исключительно вызваны переключений контекста с другими программами (как было отмечено time -v).

Это единственная причина для этой разницы? И следует ли мне доверять время, указанное моей программой или системой, когда вы смотрите на производительность кода?

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

Предостережения

  • Я не разместить код, как это на самом деле не отношение к рассматриваемому вопросу. Если вы хотите знать, что это простой тест, который выполняет 100 000 000 случайных арифметических операций с плавающей запятой.

  • Я знаю, что другие часы в моем коде на C++ могут быть более или менее подходящими для отличительных обстоятельств (this stack overflow question). High_resolution_clock - всего лишь пример.

Edit: Код по запросу

#include <chrono> 
#include <cstdlib> 
#include <iostream> 
#include <vector> 

using namespace std; 
using namespace std::chrono; 

int main() { 
    size_t n = 100000000; 

    double d = 1; 

    auto start_hrc = high_resolution_clock::now(); 

    for(size_t i = 0; i < n; ++i) { 
    switch(rand() % 4) { 
     case 0: d += 0.0001; break; 
     case 1: d -= 0.0001; break; 
     case 2: d *= 0.0001; break; 
     case 3: d /= 0.0001; break; 
    } 
    } 

    auto end_hrc = high_resolution_clock::now(); 
    duration<double> diff_hrc = end_hrc - start_hrc; 
    cout << d << endl << endl; 
    cout << "Time-HRC: " << diff_hrc.count() << " s" << endl; 
} 
+0

Начальный выход 'time' будет время часы от начала программы до конца программы, которая может занять некоторое время, если бы переключение контекста, как вы упоминается.Я бы поверил high_resolution_clock, так как он, скорее всего, тоже будет спать, пока ваш поток спал. Я знаю, что вы сказали, что не хотите показывать код, но было бы неплохо точно узнать, как вы измерили свои тайминги, поэтому код подходит для этого. – AndyG

+0

Я загрузил время, которое не сильно отличается от каждого учебника по high_resolution_clock, который я нашел. – pippin1289

+0

Исправьте меня, если я ошибаюсь, но предположение в коде состоит в том, что количество тиков составляет секунды? Каков результат, если вы используете 'std :: chrono :: duration_cast (end_hrc-start_hrc)'? – AndyG

ответ

0

Мой вопрос: что вызывает такое резкое различие между измерениями времени OS и времени измерений производительности?

Похоже, ваша система занимает некоторое время, чтобы начать ваше приложение. Вероятно, проблема с ресурсами: недостаточно свободной памяти (swapping) или избыточного подписного процессора.

Нет драматической разницы не наблюдается на моем рабочем столе:

Time-HRC: 1.39005 s 
real 0m1.391s 
user 0m1.387s 
sys  0m0.004s 

 Смежные вопросы

  • Нет связанных вопросов^_^