Найкращий метод синхронізації в C?


80

Який найкращий спосіб приурочити розділ коду з високою роздільною здатністю та портативністю?

Чи існує стандартна бібліотека, яка має крос-платформне рішення?

Відповіді:


137

Я думаю, це має спрацювати:


10
Це насправді добре, оскільки це дає вам час процесора, а не минулий час (на минулий час можуть впливати інші процеси). Тільки майте на увазі, що цифра 10 секунд не обов’язково означає, що вона працюватиме за 10 секунд, оскільки минуло час, оскільки можуть бути міркування щодо вводу-виводу. Це заходи CPU ТІЛЬКИ .
paxdiablo

1
Я використовував це сотні разів і є найкращим / найпростішим рішенням для цього питання
Герхард

4
Ви навіть можете запхати все це в макрос, якщо часто синхронізуєте кілька речей: #define timing (a) start = clock (); а; diff = clock () - старт; msec = diff * 1000 / CLOCKS_PER_SEC; printf ("msecs:% d \ n", msec); а потім викликати: timing (IntenseFunc1 ())
eqzx

3
clock_t зазвичай довгий, а CLOCKS_PER_SEC - 1000000. У цьому випадку різниця більше 4 секунд дасть вам переповнення та дивні результати
Бегельфор

2
@paxdiablo Я отримую цілком еквівалентні результати з цим, як і з gettimeofday (), не впевнений, що ви тут говорите.
user3467349

21

gettimeofday (), ймовірно, зробить те, що ви хочете.

Якщо ви працюєте на апаратному забезпеченні Intel, ось як читати лічильник інструкцій процесора в режимі реального часу. Це покаже вам кількість циклів процесора, виконаних з часу завантаження процесора. Це, мабуть, найдрібніший, найнижчий лічильник накладних витрат, який ви можете отримати для вимірювання продуктивності.

Зверніть увагу, що це кількість циклів процесора. У Linux ви можете отримати швидкість процесора з / proc / cpuinfo і розділити, щоб отримати кількість секунд. Перетворити це на подвійне дуже зручно.

Коли я запускаю це на своїй коробці, я отримую

11867927879484732
11867927879692217
потрібно було так багато часу, щоб зателефонувати printf: 207485

Ось посібник розробника Intel, який містить багато деталей.


5

gettimeofday поверне час з точністю до мікросекунд в межах дозволу системного годинника. Можливо, ви також захочете перевірити проект High Res Timers на SourceForge.



1

Якщо ви не хочете часу процесора, тоді я думаю, що ви шукаєте структуру timeval.

Для розрахунку часу виконання я використовую наступне:


0

Висока роздільна здатність відносна ... Я розглядав приклади, і вони в основному обслуговують мілісекунди. Однак для мене важливо вимірювати мікросекунди. Я не бачив рішення, незалежного від платформи, протягом мікросекунд, і думав, що щось на зразок коду нижче буде корисним. Я тимчасово встановлював хронометраж для Windows, і, швидше за все, додам реалізацію gettimeofday (), виконуючи те саме в AIX / Linux.

Використання:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.