Существует ли альтернатива для сна () в C?

Я думаю, что вы можете сначала установить основные галочки y вручную, а затем изменить каждую метку

dfWIM = pd.DataFrame({'AXLES': np.random.randint(3, 10, 1000)})
total = len(dfWIM)*1.
plt.figure(figsize=(12,8))
ax = sns.countplot(x="AXLES", data=dfWIM, order=[3,4,5,6,7,8,9,10,11,12])
plt.title('Distribution of Truck Configurations')
plt.xlabel('Number of Axles')
plt.ylabel('Frequency [%]')

for p in ax.patches:
        ax.annotate('{:.1f}%'.format(100*p.get_height()/total), (p.get_x()+0.1, p.get_height()+5))

#put 11 ticks (therefore 10 steps), from 0 to the total number of rows in the dataframe
ax.yaxis.set_ticks(np.linspace(0, total, 11))

#adjust the ticklabel to the desired format, without changing the position of the ticks. 
_ = ax.set_yticklabels(map('{:.1f}%'.format, 100*ax.yaxis.get_majorticklocs()/total))

14
задан Mihai Limbășan 29 November 2008 в 15:53
поделиться

11 ответов

Альтернативы зависят в том, что Вы пытаетесь сделать и что ОС Вы идете.

, Если Вы просто хотите напрасно тратить время, затем они могли бы помочь:

В большинстве систем типов Unix Вы найдете функцию 'usleep', которая более или менее похожа на сон с большим разрешением. Будьте осторожны с тем, потому что он обычно не может спать в течение всего одной микросекунды.

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

системы окон On, у Вас есть Сон, который является в значительной степени тем же, но взятием многих миллисекунд.

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

12
ответ дан 1 December 2019 в 05:47
поделиться

любой достойный компилятор C, без дополнительной работы, удалил бы Ваш код полностью, и задержка исчезнет

4
ответ дан 1 December 2019 в 05:47
поделиться

В производной Unix ОС Вы, вероятно, запланировали бы сигнал () вызов, и Ваш код просто заблокирует код, пока сигнал не будет повышен. Сигналы предназначаются для цели, и они очень просты и эффективны.

1
ответ дан 1 December 2019 в 05:47
поделиться

спите на самом деле взаимодействует через интерфейс с операционной системой, куда ждущие процессы помещаются за пределами планирования очереди. Я обычно использую:

poll(0, 0, milliseconds);

для POSIX совместимые системы. select также работы для окон (у них должен быть встроенный API (вероятно, названный Sleep) для этого.)

3
ответ дан 1 December 2019 в 05:47
поделиться

Существует больше информации о том, как сон () работы здесь

Между прочим, активное ожидание не обязательно для любителей - хотя это действительно записывает процессор, который можно хотеть использовать для некоторой другой цели. При использовании источника времени Вы ограничены гранулярностью того источника. НАПРИМЕР, если Вы имеете таймер на 1 мс и хотите к пути 500 нас, у Вас есть проблема. Если Ваша встроенная система может обработать то, что Вы будете шуметь в цикле для 500 мкс, которые могли бы быть приемлемыми. И даже если у Вас есть таймер с Вашей желаемой гранулярностью, также необходимо добраться, прерывание от того таймера в нужное время... затем диспетчеризируют ot, который обработчик прерываний... затем получает к коду. Иногда занятый цикл является самым целесообразным решением. Иногда.

6
ответ дан 1 December 2019 в 05:47
поделиться

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

Иначе, Вы не сможете сказать, сколько времени это действительно собирается взять.

Ранние компьютерные игры имели эту проблему - они были созданы для ПК на 4.7 МГц и, когда более быстрые компьютеры пришли, они были неиграемы.

лучший способ, которым может работать 'сон', состоит в том, чтобы ЦП знал, во сколько это в любой данной точке. Не обязательно фактическое время (7:15), но по крайней мере относительное время (8 612 секунд начиная с некоторого момента времени).

Тот способ, которым это может применить дельту к текущему времени и ожидать в цикле до current+delta, достигнут.

Что-либо, что полагается на число циклы ЦП, по сути ненадежно, поскольку ЦП может уйти к другой задаче и оставить Ваше зависание цикла.

Скажем, у Вас есть 16-разрядный порт I/O с отображенной памятью, который ЦП увеличивает однажды секунда. Давайте также предположим, что это в ячейке памяти 0x33 в Вашей встроенной системе, где ints - также 16 битов. Функция звонила, сон затем становится чем-то как:

void sleep (unsigned int delay) {
    unsigned int target = peek(0x33) + delay;
    while (peek(0x33) != target);
}

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

6
ответ дан 1 December 2019 в 05:47
поделиться

Вы говорите о "встроенном программировании" в OP. Если Вы делаете встроенную работу и нуждаетесь в чем-то как сон (), часто существуют аппаратные доступные счетчики/таймеры. Это будет варьироваться от архитектуры до архитектуры, поэтому взглянет на таблицу данных.

, Если Вы не делаете встроенной работы, я приношу извинения :)

7
ответ дан 1 December 2019 в 05:47
поделиться

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

способом, которым Вы обычно делаете это, является Ваш ЦП, реализует своего рода НЕАКТИВНЫЕ инструкции или инструкции по СНУ, которые заставят его временно прекращать обрабатывать команды. Внешняя линия прерывания, подключенная к таймерной схеме, разбудит процессор назад равномерно, и которые указывают на проверки ЦП, чтобы видеть, спало ли это довольно долго, и если не это возвращается ко сну.

//Pseudo code
int start = getTime();
int end = start + sleepTime;

while (getTime() < end) {
       asm("SLEEP");
}

точные детали варьируются с процессора на процессор. Если Вы работаете как процесс на ОС, вызов сна обычно просто говорит планировщику приостанавливать Ваш процесс, и затем ядро решает, запланировать ли другой процесс или спать ЦП. Кроме того, вышеупомянутый код не будет adequete для систем реального времени, которые хотят гарантии крайнего срока, и т.д. В тех случаях, необходимо будет получить время в цикле, знать продолжительность прерывания времени, таким образом, ou будут знать, можно ли повторно спать, не унося крайний срок, и потенциально повторно программировать аппаратные средства таймера или активное ожидание.

12
ответ дан 1 December 2019 в 05:47
поделиться

Один общий механизм должен использовать select(), который, как гарантируют, приведет к таймауту, и укажет время сна как тайм-аут:

// Sleep for 1.5 sec
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500000;
select(0, NULL, NULL, NULL, &tv);

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

преимущество select() по занятому циклу состоит в том, что он использует очень небольшие ресурсы при сне, в то время как занятый цикл монополизирует процессор так же, как разрешено его приоритетным уровнем.

22
ответ дан 1 December 2019 в 05:47
поделиться

Вид цикла, который Вы описываете, называют "активным ожиданием". В реальных операционных системах сон не вызывает активное ожидание; это говорит операционной системе не планировать процесс в том, пока период сна не закончен.

25
ответ дан 1 December 2019 в 05:47
поделиться

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

5
ответ дан 1 December 2019 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: