Commit d49516bc by Jean-Louis Leroy

Make it compile with Visual Studio 2013.

parent 693967fe
...@@ -27,12 +27,16 @@ ...@@ -27,12 +27,16 @@
#if defined(__GNUC__) #if defined(__GNUC__)
# define BENCHMARK_UNUSED __attribute__((unused)) # define BENCHMARK_UNUSED __attribute__((unused))
# define BENCHMARK_ALWAYS_INLINE __attribute__((always_inline)) # define BENCHMARK_ALWAYS_INLINE __attribute__((always_inline))
# define BENCHMARK_NOEXCEPT noexcept
#elif defined(_MSC_VER) && !defined(__clang__) #elif defined(_MSC_VER) && !defined(__clang__)
# define BENCHMARK_UNUSED # define BENCHMARK_UNUSED
# define BENCHMARK_ALWAYS_INLINE __forceinline # define BENCHMARK_ALWAYS_INLINE __forceinline
# define BENCHMARK_NOEXCEPT
# define __func__ __FUNCTION__
#else #else
# define BENCHMARK_UNUSED # define BENCHMARK_UNUSED
# define BENCHMARK_ALWAYS_INLINE # define BENCHMARK_ALWAYS_INLINE
# define BENCHMARK_NOEXCEPT
#endif #endif
#if defined(__GNUC__) #if defined(__GNUC__)
......
...@@ -15,11 +15,11 @@ ...@@ -15,11 +15,11 @@
#include "benchmark/benchmark.h" #include "benchmark/benchmark.h"
#include "internal_macros.h" #include "internal_macros.h"
#include <sys/time.h>
#ifndef OS_WINDOWS #ifndef OS_WINDOWS
#include <sys/time.h>
#include <sys/resource.h> #include <sys/resource.h>
#endif
#include <unistd.h> #include <unistd.h>
#endif
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
......
...@@ -40,7 +40,10 @@ ...@@ -40,7 +40,10 @@
extern "C" uint64_t __rdtsc(); extern "C" uint64_t __rdtsc();
#pragma intrinsic(__rdtsc) #pragma intrinsic(__rdtsc)
#endif #endif
#if !defined(OS_WINDOWS)
#include <sys/time.h> #include <sys/time.h>
#endif
namespace benchmark { namespace benchmark {
// NOTE: only i386 and x86_64 have been well tested. // NOTE: only i386 and x86_64 have been well tested.
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <utility> #include <utility>
#include "internal_macros.h"
namespace benchmark { namespace benchmark {
...@@ -14,7 +15,7 @@ std::string HumanReadableNumber(double n); ...@@ -14,7 +15,7 @@ std::string HumanReadableNumber(double n);
std::string StringPrintF(const char* format, ...); std::string StringPrintF(const char* format, ...);
inline std::ostream& inline std::ostream&
StringCatImp(std::ostream& out) noexcept StringCatImp(std::ostream& out) BENCHMARK_NOEXCEPT
{ {
return out; return out;
} }
......
...@@ -13,8 +13,15 @@ ...@@ -13,8 +13,15 @@
// limitations under the License. // limitations under the License.
#include "walltime.h" #include "walltime.h"
#include "benchmark/macros.h"
#include "internal_macros.h"
#if defined(OS_WINDOWS)
#include <time.h>
#include <winsock.h> // for timeval
#else
#include <sys/time.h> #include <sys/time.h>
#endif
#include <cstdio> #include <cstdio>
#include <cstdint> #include <cstdint>
...@@ -92,7 +99,22 @@ private: ...@@ -92,7 +99,22 @@ private:
WallTime Slow() const { WallTime Slow() const {
struct timeval tv; struct timeval tv;
#if defined(OS_WINDOWS)
FILETIME file_time;
SYSTEMTIME system_time;
ULARGE_INTEGER ularge;
const unsigned __int64 epoch = 116444736000000000LL;
GetSystemTime(&system_time);
SystemTimeToFileTime(&system_time, &file_time);
ularge.LowPart = file_time.dwLowDateTime;
ularge.HighPart = file_time.dwHighDateTime;
tv.tv_sec = (long)((ularge.QuadPart - epoch) / 10000000L);
tv.tv_usec = (long)(system_time.wMilliseconds * 1000);
#else
gettimeofday(&tv, nullptr); gettimeofday(&tv, nullptr);
#endif
return tv.tv_sec + tv.tv_usec * 1e-6; return tv.tv_sec + tv.tv_usec * 1e-6;
} }
...@@ -100,8 +122,6 @@ private: ...@@ -100,8 +122,6 @@ private:
static_assert(sizeof(float) <= sizeof(int32_t), static_assert(sizeof(float) <= sizeof(int32_t),
"type sizes don't allow the drift_adjust hack"); "type sizes don't allow the drift_adjust hack");
static constexpr double kMaxErrorInterval = 100e-6;
WallTime base_walltime_; WallTime base_walltime_;
int64_t base_cycletime_; int64_t base_cycletime_;
int64_t cycles_per_second_; int64_t cycles_per_second_;
...@@ -147,7 +167,8 @@ WallTimeImp::WallTimeImp() ...@@ -147,7 +167,8 @@ WallTimeImp::WallTimeImp()
cycles_per_second_(0), seconds_per_cycle_(0.0), cycles_per_second_(0), seconds_per_cycle_(0.0),
last_adjust_time_(0), drift_adjust_(0), last_adjust_time_(0), drift_adjust_(0),
max_interval_cycles_(0) { max_interval_cycles_(0) {
cycles_per_second_ = static_cast<int64_t>(CyclesPerSecond()); const double kMaxErrorInterval = 100e-6;
cycles_per_second_ = static_cast<int64_t>(CyclesPerSecond());
CHECK(cycles_per_second_ != 0); CHECK(cycles_per_second_ != 0);
seconds_per_cycle_ = 1.0 / cycles_per_second_; seconds_per_cycle_ = 1.0 / cycles_per_second_;
max_interval_cycles_ = max_interval_cycles_ =
...@@ -213,15 +234,27 @@ std::string DateTimeString(bool local) { ...@@ -213,15 +234,27 @@ std::string DateTimeString(bool local) {
typedef std::chrono::system_clock Clock; typedef std::chrono::system_clock Clock;
std::time_t now = Clock::to_time_t(Clock::now()); std::time_t now = Clock::to_time_t(Clock::now());
char storage[128]; char storage[128];
std::size_t written;
std::tm timeinfo;
std::memset(&timeinfo, 0, sizeof(std::tm));
if (local) { if (local) {
localtime_r(&now, &timeinfo); #if defined(OS_WINDOWS)
written = std::strftime(storage, sizeof(storage), "%x %X", ::localtime(&now));
#else
std::tm timeinfo;
std::memset(&timeinfo, 0, sizeof(std::tm));
::localtime_r(&now, &timeinfo);
written = std::strftime(storage, sizeof(storage), "%F %T", &timeinfo);
#endif
} else { } else {
gmtime_r(&now, &timeinfo); #if defined(OS_WINDOWS)
written = std::strftime(storage, sizeof(storage), "%x %X", ::gmtime(&now));
#else
std::tm timeinfo;
std::memset(&timeinfo, 0, sizeof(std::tm));
::gmtime_r(&now, &timeinfo);
written = std::strftime(storage, sizeof(storage), "%F %T", &timeinfo);
#endif
} }
std::size_t written = std::strftime(storage, sizeof(storage), "%F %T", &timeinfo);
CHECK(written < arraysize(storage)); CHECK(written < arraysize(storage));
((void)written); // prevent unused variable in optimized mode. ((void)written); // prevent unused variable in optimized mode.
return std::string(storage); return std::string(storage);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment