2010-06-04 14:48:49 +02:00
|
|
|
/*
|
|
|
|
Copyright (c) 2007-2010 iMatix Corporation
|
|
|
|
|
|
|
|
This file is part of 0MQ.
|
|
|
|
|
|
|
|
0MQ is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the Lesser GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
0MQ is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
Lesser GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the Lesser GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <stdlib.h>
|
2010-06-04 16:29:36 +02:00
|
|
|
#ifdef _WIN32
|
|
|
|
# include "../src/windows.hpp"
|
|
|
|
#else
|
2010-06-04 14:48:49 +02:00
|
|
|
# include <sys/time.h>
|
|
|
|
# include <unistd.h>
|
|
|
|
#endif
|
|
|
|
#include "../src/stdint.hpp"
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
|
|
|
static uint64_t now ()
|
|
|
|
{
|
|
|
|
// Get the high resolution counter's accuracy.
|
|
|
|
LARGE_INTEGER ticksPerSecond;
|
|
|
|
QueryPerformanceFrequency (&ticksPerSecond);
|
|
|
|
|
|
|
|
// What time is it?
|
|
|
|
LARGE_INTEGER tick;
|
|
|
|
QueryPerformanceCounter (&tick);
|
|
|
|
|
|
|
|
// Convert the tick number into the number of seconds
|
|
|
|
// since the system was started.
|
|
|
|
double ticks_div = (double) (ticksPerSecond.QuadPart / 1000000);
|
|
|
|
return (uint64_t) (tick.QuadPart / ticks_div);
|
|
|
|
}
|
|
|
|
|
|
|
|
void perf_sleep (int seconds_)
|
|
|
|
{
|
|
|
|
Sleep (seconds_ * 1000);
|
|
|
|
}
|
|
|
|
|
|
|
|
#else /* not _WIN32 */
|
|
|
|
|
|
|
|
static uint64_t now ()
|
|
|
|
{
|
|
|
|
struct timeval tv;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
rc = gettimeofday (&tv, NULL);
|
|
|
|
assert (rc == 0);
|
|
|
|
return (tv.tv_sec * (uint64_t) 1000000 + tv.tv_usec);
|
|
|
|
}
|
|
|
|
|
|
|
|
void perf_sleep (int seconds_)
|
|
|
|
{
|
|
|
|
sleep (seconds_);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _WIN32 */
|
|
|
|
|
|
|
|
void *stopwatch_start ()
|
|
|
|
{
|
|
|
|
uint64_t *watch = (uint64_t*) malloc (sizeof (uint64_t));
|
|
|
|
assert (watch);
|
|
|
|
*watch = now ();
|
|
|
|
return (void*) watch;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned long stopwatch_stop (void *watch_)
|
|
|
|
{
|
|
|
|
uint64_t end = now ();
|
|
|
|
uint64_t start = *(uint64_t*) watch_;
|
|
|
|
free (watch_);
|
|
|
|
return (unsigned long) (end - start);
|
|
|
|
}
|