Я запускал простой тест для синхронизации кода на 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;
}
Начальный выход 'time' будет время часы от начала программы до конца программы, которая может занять некоторое время, если бы переключение контекста, как вы упоминается.Я бы поверил high_resolution_clock, так как он, скорее всего, тоже будет спать, пока ваш поток спал. Я знаю, что вы сказали, что не хотите показывать код, но было бы неплохо точно узнать, как вы измерили свои тайминги, поэтому код подходит для этого. – AndyG
Я загрузил время, которое не сильно отличается от каждого учебника по high_resolution_clock, который я нашел. – pippin1289
Исправьте меня, если я ошибаюсь, но предположение в коде состоит в том, что количество тиков составляет секунды? Каков результат, если вы используете 'std :: chrono :: duration_cast (end_hrc-start_hrc)'? –
AndyG