Синхронизация C++, миллисекунды с тех пор в последний раз целая секунда

Используйте lubridate, создайте вектор, начинающийся с известного месяца:

Тест: для этих чисел месяца предположим, что Jan = 1:

> m = c(1,2,6,7,9,10,11,12,0,99,NA)

do:

> require(lubridate)
> as.character(month(ymd(010101) + months(m-1),label=TRUE,abbr=TRUE))
 [1] "Jan" "Feb" "Jun" "Jul" "Sep" "Oct" "Nov" "Dec" "Dec" "Mar" NA   

, где (m-1) - это то, что мы начинаем с даты в январе.

Чтобы увидеть, как это сравнивается:

> cbind(m,as.character(month(ymd(010101) + months(m-1),label=TRUE,abbr=TRUE)))
      m         
 [1,] "1"  "Jan"
 [2,] "2"  "Feb"
 [3,] "6"  "Jun"
 [4,] "7"  "Jul"
 [5,] "9"  "Sep"
 [6,] "10" "Oct"
 [7,] "11" "Nov"
 [8,] "12" "Dec"
 [9,] "0"  "Dec"
[10,] "99" "Mar"
[11,] NA   NA   

Обратите внимание, что он интерпретирует месяц числа как mod-12, поэтому 99 отображает 3 (99 = 3 + (8 * 12)), а NA возвращает NA. Некоторые из уже опубликованных ответов не будут делать этого. -1 - ноябрь, так как 0 - декабрь

5
задан fluter 10 May 2016 в 05:22
поделиться

10 ответов

Повышение. DateTime имеет миллисекунду и представления наносекунды, ЕСЛИ базовая платформа поддерживает их. В то время как это использует платформу определенный код, это не допускает те детали в Ваш код.

Если это - грандиозное предприятие, у них действительно есть другой способ сделать независимое от платформы подвторое разрешение. Эта страница несколько абзацев вниз говорят о том, как сделать это.

(От Страницы)

Например, давайте предположим, что мы хотим создать использование количества, которое представляет десятые части секунды. Таким образом, каждая галочка составляет 0,1 секунды.

int number_of_tenths = 5;
//create a resolution independent count -- divide by 10 since there are 
//10 tenths in a second.  
int count = number_of_tenths*(time_duration::ticks_per_second()/10);
time_duration td(1,2,3,count); //01:02:03.5 //no matter the resolution settings
11
ответ дан 18 December 2019 в 06:04
поделиться

Нет портативного решения этой проблемы, так как ANSI C не определяет стандартную точную миллисекундой функцию времени. При использовании Windows можно использовать GetTickCount (), timeGetTime (), или QueryPerformanceCounter ()/QueryPerformanceFrequency (). Следует иметь в виду, что они имеют различную точность и различные затраты во время выполнения.

В других операционных системах существуют другие подобные функции; я не уверен, что они первое, что пришло на ум.

8
ответ дан 18 December 2019 в 06:04
поделиться

GetTickCount в Windows gettimeofday в *отклоняют QueryPerformanceCounter в Windows для лучшего разрешения (хотя GetTickCount должен сделать это),

3
ответ дан 18 December 2019 в 06:04
поделиться

Как другой сказали, нет портативного способа сделать это.

Что я делаю (На msvc ++, и linux/g ++), я использую следующий класс, которые используют QueryPerformanceCounter в Windows и gettimeofday на Linux. Это - класс таймера, который может получить Вас прошедшее время между двумя вызовами. Вы могли бы хотеть изменить его к соответствиям Ваши потребности.

#if defined(_MSC_VER)
#  define NOMINMAX // workaround un bug dans windows.h qui define des macros
                   // "min" et "max" qui entrent en conflit avec la STL.
#  include <windows.h>
#else
#  include <sys/time.h>
#endif

namespace Utils
{

   /**
    * Implémente un chronométre qui mesure le temps etre deux appels.
    */
   class CTimer
   {
   private:
#     if defined(_MSC_VER)
         LARGE_INTEGER m_depart;
#     else
         timeval m_depart;
#     endif

   public:
      /**
       * Démarre le timer.
       * 
       * Cette fonction sert à démarrer le timer. Si le timer est  déja
       * démarrer, elle le redémarre simplement.
       */
      inline void start()
      {
#        if defined(_MSC_VER)
            QueryPerformanceCounter(&m_depart);
#        else
            gettimeofday(&m_depart, 0);
#        endif

      };

      /**
       * Retourne le nombre de secondes depuis le départ du timer.
       * 
       * @return Nombre de secondes écoulés depuis le départ du timer
       */
      inline float GetSecondes() const
      {
#        if defined(_MSC_VER)
            LARGE_INTEGER now;
            LARGE_INTEGER freq;

            QueryPerformanceCounter(&now);
            QueryPerformanceFrequency(&freq);

            return (now.QuadPart - m_depart.QuadPart) / static_cast<float>(freq.QuadPart);
#        else
            timeval now;
            gettimeofday(&now, 0);

            return now.tv_sec - m_depart.tv_sec + (now.tv_usec - m_depart.tv_usec) / 1000000.0f;
#        endif
      };
   };
}
2
ответ дан 18 December 2019 в 06:04
поделиться

Высокое разрешение, низко служебная синхронизация для процессоров Intel

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

Обратите внимание, что это - количество циклов ЦП. На Linux можно получить скорость ЦП от/proc/cpuinfo и разделиться для получения числа секунд. Преобразование этого к двойному довольно удобно.

Когда я выполняю это на своем поле, я добираюсь

11867927879484732
11867927879692217
it took this long to call printf: 207485

Вот Руководство разработчика Intel, которое дает тонны детали.

#include < stdio.h >  // stackoverflow bug: pre tag eats the filenames,
#include < stdint.h > // so i had to put spaces in the angle brackets

inline uint64_t rdtsc() {
    uint32_t lo, hi;
    __asm__ __volatile__ (
      "xorl %%eax, %%eax\n"
      "cpuid\n"
      "rdtsc\n"
      : "=a" (lo), "=d" (hi)
      :
      : "%ebx", "%ecx");
    return (uint64_t)hi << 32 | lo;
}

main()
{
    unsigned long long x;
    unsigned long long y;
    x = rdtsc();
    printf("%lld\n",x);
    y = rdtsc();
    printf("%lld\n",y);
    printf("it took this long to call printf: %lld\n",y-x);
}
2
ответ дан 18 December 2019 в 06:04
поделиться

Если Вы будете на Unix, то gettimeofday () возвратит секунды и микросекунды, до разрешения системных часов.

int gettimeofday(struct timeval *tv, struct timezone *tz);

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
2
ответ дан 18 December 2019 в 06:04
поделиться
#include <ctime>

clock_t elapsed = static_cast<double>(clock() / CLOCKS_PER_SEC);

истекший будет прошедшее процессорное время, в секундах.

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

1
ответ дан 18 December 2019 в 06:04
поделиться

Изучите методы QueryPerformanceCounter, если это для Windows.

-1
ответ дан 18 December 2019 в 06:04
поделиться

Что-либо не в (c)time.h заголовок требует определенных для ОС методов. Я полагаю, что все те методы, поддерживают предложение.

В чем ОС Вы работаете?

0
ответ дан 18 December 2019 в 06:04
поделиться

Библиотека Threading Building Blocks Intel имеет функцию для этого, но TBB в настоящее время только availble на Intel и клонах (то есть, это не доступно на SPARCs, PowerPC, ARM, и т.д.),

-1
ответ дан 18 December 2019 в 06:04
поделиться
Другие вопросы по тегам:

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