Код, который пытается доказать закон Амдаля, используя pthreads [duplicate]

Существует два способа создания и установки Python в Mac OS X. Один из них является традиционной стандартной библиотекой Unix-y. Другой известен как установка framework, макет файла, аналогичный другим фреймворкам на OS X, где все каталоги компонентов (include, lib, bin) для продукта установлены как подкаталоги под основной каталог. Проект Fink устанавливает Pythons с использованием метода общей библиотеки Unix. Большинство других дистрибьюторов, включая поставляемые Apple Pythons в OS X, установщики python.org и MacPorts, устанавливают framework версии Python. Одним из преимуществ установки системы является то, что она будет работать правильно с различными вызовами API OS X, для которых требуется соединение с диспетчером окон (обычно это интерфейсы, связанные с GUI), потому что интерпретатор Python упакован как пакет приложений в рамках.

Если вам нужны функции в matplotlib, которые требуют функций GUI, самым простым подходом может быть переход на MacPorts, который также упаковывает matplotlib (port py27-matplotlib) и его зависимости. Если да, будьте осторожны, чтобы не смешивать пакеты между Fink и MacPorts. Лучше придерживаться того или другого, если вы не очень осторожны. Соответственно отрегулируйте путь к оболочке; было бы безопаснее удалить все пакеты Fink и установить версии MacPorts.

38
задан Suugaku 3 June 2010 в 02:23
поделиться

2 ответа

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

Если вы хотите узнать время выполнения настенных часов, вам нужно использовать соответствующую функцию. Единственный в ANSI C - time(), который обычно имеет только 1-секундное разрешение.

Однако, как вы уже сказали, вы используете POSIX, это означает, что вы можете использовать clock_gettime(), определенный в time.h. Для этого лучше всего использовать часы CLOCK_MONOTONIC:

struct timespec start, finish;
double elapsed;

clock_gettime(CLOCK_MONOTONIC, &start);

/* ... */

clock_gettime(CLOCK_MONOTONIC, &finish);

elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;

(обратите внимание, что я тщательно выполнил расчет elapsed, чтобы гарантировать, что точность не теряется при очень коротких интервалах времени ).

Если ваша ОС не предоставляет CLOCK_MONOTONIC (которую вы можете проверить во время выполнения с sysconf(_SC_MONOTONIC_CLOCK)), вы можете использовать CLOCK_REALTIME как резервную копию, но обратите внимание, что последний имеет что он будет генерировать неверные результаты, если системное время будет изменено во время работы вашего процесса.

87
ответ дан Conchylicultor 19 August 2018 в 04:35
поделиться
  • 1
    & GT; & GT; Это правильный ответ, опубликованный @caf в океане многих вводящих в заблуждение ответов на SO. Это особенно верно для систем реального времени, поддерживающих POSIX. Я бы не использовал часы, время, gettimeofday или любую другую функцию для этой цели. & Л; & л; – Xofo 25 May 2016 в 18:45
  • 2
    Что вы подразумеваете под «осторожным»? вычисление elapsed? Есть ли какое-то значение для использования двух отдельных операторов вместо объединения их в одно задание? – sevko 4 December 2016 в 18:47
  • 3
    @sevko: Нет, это можно сделать в одном утверждении - я имею в виду, что вычитание обеих секунд «секунд» отдельно от частей «наносекунд», а не (например) конвертация «финиш» и «начало» в значения с плавающей запятой, а затем вычесть их. – caf 5 December 2016 в 00:04
  • 4
    Хороший ответ. Здесь я должен сделать важное замечание, что clock() действительно измеряет время настенных часов в MSVC. – Nik-Lz 17 February 2017 в 16:38
  • 5
    Хотя это работает, если нить не спит, он не может измерить оставшееся время процессора после каждого кадра. – user877329 21 March 2017 в 11:33

Какое временное разрешение вам нужно? Вы можете использовать time () с time.h для второго разрешения. Если вам требуется более высокое разрешение, вы можете использовать что-то более специфичное для системы. См. Функцию Timer для предоставления времени в nano секундах с использованием C ++

1
ответ дан Community 19 August 2018 в 04:35
поделиться
Другие вопросы по тегам:

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